Azure ad b2c ADB2C如何在两个不同的应用程序之间共享用户令牌?

Azure ad b2c ADB2C如何在两个不同的应用程序之间共享用户令牌?,azure-ad-b2c,msal,Azure Ad B2c,Msal,我希望实现这一点: 我有两个应用程序使用adb2c进行身份验证。我希望用户能够在第一个应用程序中以交互方式登录,然后在第二个应用程序中以静默方式登录 我现在拥有的: 这两个应用程序都在Azure环境中注册,具有两个不同的客户端id。 除了客户端id之外,这两个应用程序共享完全相同的代码、相同的缓存和相同的配置。 我正在用C#编写代码,并使用Microsoft.Identity.Client dll 我的问题是: 如果我对两个应用程序使用相同的客户端id(就像它们注册为单个应用程序一样),用户可以

我希望实现这一点: 我有两个应用程序使用adb2c进行身份验证。我希望用户能够在第一个应用程序中以交互方式登录,然后在第二个应用程序中以静默方式登录

我现在拥有的: 这两个应用程序都在Azure环境中注册,具有两个不同的客户端id。 除了客户端id之外,这两个应用程序共享完全相同的代码、相同的缓存和相同的配置。 我正在用C#编写代码,并使用Microsoft.Identity.Client dll

我的问题是: 如果我对两个应用程序使用相同的客户端id(就像它们注册为单个应用程序一样),用户可以在一个应用程序中交互登录,然后在第二个应用程序中以静默方式登录

但是,如果我使用两个不同的客户端id,它将不再工作。如果用户第一次在应用程序1中以交互方式登录,当我在应用程序2中调用GetAccountsAsync()以在缓存中获取用户帐户时,它不会返回任何帐户

我的代码: 要以交互方式获取令牌,请执行以下操作:

private async Task<AuthenticationResult> AcquireTokenInteractiveAsync()
{
   try
   {
      AuthenticationResult ar = await pubClientApp.AcquireTokenInteractive(config.ApiScopes).WithB2CAuthority(config.GetAuthoritySignUpSignIn()).WithExtraQueryParameters(ui_locale).ExecuteAsync();
      return ar;
   }
   catch (MsalException ex)
   {
   }
   catch (Exception ex)
   {
   }
   return null;
}
专用异步任务AcquireTokenInteractiveAsync()
{
尝试
{
AuthenticationResult ar=await pubClientApp.AcquireTokenInteractive(config.ApiScopes)。具有B2CAuthority(config.GetAuthoritySignUpSignIn())。具有ExtraQueryParameters(ui_locale)。ExecuteAsync();
返回ar;
}
渔获物(MSAlexex)
{
}
捕获(例外情况除外)
{
}
返回null;
}
要以静默方式获取令牌:

private async Task<AuthenticationResult> AcquireTokenSilentAsync()
{
   try
   {
      var accounts = await pubClientApp.GetAccountsAsync();
      if (accounts.Count() > 0)
      {
         AuthenticationResult ar = await pubClientApp.AcquireTokenSilent(config.ApiScopes,accounts.FirstOrDefault()).ExecuteAsync();
         return ar;
      }
   }
   catch (Exception ex)
   {
   }
   return null;
}
专用异步任务AcquireTokenSilentAsync()
{
尝试
{
var accounts=await publicclientapp.GetAccountsAsync();
如果(accounts.Count()>0)
{
AuthenticationResult ar=await pubClientApp.AcquireTokenSilent(config.ApiScopes,accounts.FirstOrDefault()).ExecuteAsync();
返回ar;
}
}
捕获(例外情况除外)
{
}
返回null;
}

感谢您的帮助:)

您不能在应用程序之间共享令牌,这是您的期望

一旦静默呼叫失败,您必须在第二个应用程序上以交互方式获取令牌,并且交互流将依赖AAD B2C会话cookies为用户提供单一登录

您可以在此处阅读有关会话和单点登录的信息:

嗨,谢谢你的回答。我阅读了文档,看到了以下内容:“单一登录配置-Azure AD B2C会话可以使用以下作用域进行配置:租户-此设置为默认设置。使用此设置允许B2C租户中的多个应用程序和用户流共享同一用户会话。例如,一旦用户登录到一个应用程序,用户也可以在访问另一个应用程序时无缝登录。“我正在使用租户配置,因此根据文档,我尝试实现的应该是可能的,不是吗?根据我的回答,您尝试从缓存中获取应用2上的令牌,它将失败,然后尝试以交互方式获取,用户将通过浏览器cookie获取SSO,B2C将向App 2发行新代币。您不需要按照此场景的文档配置任何内容,只需要app2通过我们的身份验证端点执行重定向即可获得SSO。