azure-ad-b2c - ADB2C 如何在两个不同的应用程序之间共享用户令牌?
问题描述
我想实现这一点: 我有两个应用程序使用 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;
}
静默获取令牌:
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;
}
谢谢你的帮助 :)
解决方案
您不能在应用程序之间共享令牌,这是您所期望的。
一旦静默呼叫失败,您必须在第二个应用程序上以交互方式获取令牌,并且交互流程将依赖 AAD B2C 会话 cookie 为用户提供单点登录。
您可以在此处阅读有关会话和单点登录的信息: https ://docs.microsoft.com/en-us/azure/active-directory-b2c/session-behavior?pivots=b2c-custom-policy
推荐阅读
- eclipse - 安装 sonarLint eclipse Juno 时出错
- rest - 当其他 HTTP 动词的路径有多个参数时,用于 POST 的 RESTful API?
- javascript - 如何获取输入值的索引不只为空
- javascript - JavaScript 中的意外 setTimeOut() 函数行为
- amazon-web-services - AWS Glue 自动创建作业
- facebook - 直播 - WebRTC 到 RTMP
- python-2.7 - 如何通过 Selenium Python 点击一个元素
- java - Android Firestore 对自定义对象模型的限制
- powershell - 如果目录以某个扩展名结尾,则对目录中的每个文件运行命令
- vue.js - 创建具有动态列和数据类型的网格(Vue.Js)