azure - 静默访问令牌如何用于 azure b2c
问题描述
我想了解 Azure B2C 的身份验证过程。据我了解,每月最多 50k 的身份验证是免费的,如果超过 50k,您需要支付更多费用。
我正在开发两个应用程序。一个用于前端,另一个用于后端,将使用 Azure B2C 对用户进行身份验证。
这是我的场景。
- 用户将前往 UI 门户使用他们的社交帐户登录。
- 用户可以根据权限通过API调用访问后端资源。
因此,据我了解,当您使用社交帐户登录 UI 时,您会收到一个访问令牌,这是 B2C 中的一种身份验证。如果他们想从 API 访问后端资源,则需要您通过发出另一个请求来获取访问令牌,如下所示。下面是静默获取令牌的示例代码。
// Retrieve the token with the specified scopes
var scope = AzureAdB2COptions.ApiScopes.Split(' ');
string signedInUserID = HttpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value;
TokenCache userTokenCache = new MSALSessionCache(signedInUserID, this.HttpContext).GetMsalCacheInstance();
ConfidentialClientApplication cca = new ConfidentialClientApplication(AzureAdB2COptions.ClientId, AzureAdB2COptions.Authority, AzureAdB2COptions.RedirectUri, new ClientCredential(AzureAdB2COptions.ClientSecret), userTokenCache, null);
AuthenticationResult result = await cca.AcquireTokenSilentAsync(scope, cca.Users.FirstOrDefault(), AzureAdB2COptions.Authority, false);
HttpClient client = new HttpClient();
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, AzureAdB2COptions.ApiUrl);
// Add token to the Authorization header and make the request
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);
HttpResponseMessage response = await client.SendAsync(request);
我的问题是,当使用您的社交帐户登录 UI 并使用另一个静默请求访问后端资源时。它算作 1 个身份验证吗?还是在 Azure B2C 中算作 2 次身份验证?
解决方案
在您的 Web 应用程序处理身份验证响应后,该ConfidentialClientApplication.AcquireTokenByAuthorizationCodeAsync
方法会从 Azure AD B2C 检索访问令牌,然后将其写入由MSALSessionCache
该类实现的令牌缓存。
在您的 Web 应用程序调用您的 Web API 之前,该ConfidentialClientApplication.AcquireTokenSilentAsync
方法会从令牌缓存中读取现有的访问令牌,并且仅在以下情况下从 Azure AD B2C 请求一个新的访问令牌:
- 令牌缓存中不存在访问令牌;
- 即将到期;或者
- 它已过期。
如果从令牌缓存中读取现有访问令牌,则无需为已颁发的令牌付费。
如果从 Azure AD B2C 请求新的访问令牌,则需要为颁发的令牌付费。
推荐阅读
- arrays - Postgres 将数组中的每个元素与通配符进行比较
- arrays - 可观察的角度服务以返回嵌套数组数据
- mysql - 如何使用主键而不是自动增量创建 MySQL
- python - 上传 django restframework api 时文件(pdf 除外)损坏
- javascript - 如果焦点移动到一个特定元素,如何防止我的 focusout 功能触发?
- c# - 我如何让后台工作人员在 asp.net 核心中每 5 分钟更新一次数据存储
- macos - 为什么这个PNG是动画的?
- html - :nth-child() 和 :nth-of-type() 不起作用
- sql-server - 如何在 SQL Server 2016 的报告服务中配置 oracle
- reactjs - 带有传入值的 Amazon Web Services 上的 reactJS 应用程序