我已经设法将我的应用程序配置为使用ADB2C进行身份验证,并且看起来工作正常。实现的ADB2C代码是Microsoft示例之一的改进,在这些示例中,他们使用SessionTokenCache类来管理TokenCache的实例。在我的应用程序中,我按以下方式检索访问令牌:
cv2.imshow(windowName, displayBuf)
cv2.waitKey(0)
此方法用于获取访问令牌,并将其传递到HttpClient的请求标头中,如下所示:
private async Task<string> _getAccessToken(IConfidentialClientCredentials credentials)
{
if (this.HasCredentials())
{
var clientCredential = new ClientCredential(credentials.ClientSecret);
var userId = this._getUserIdClaimValue();
var tokenCache = new SessionTokenCache(_httpContextResolver.Context, userId);
var confidentialClientApplication = new ConfidentialClientApplication(
credentials.ClientId,
credentials.Authority,
credentials.RedirectUri,
clientCredential,
tokenCache.GetInstance(),
null);
IAccount account = confidentialClientApplication.GetAccountsAsync().Result.FirstOrDefault();
if (account == null)
{
return "";
}
var authenticationResult = await confidentialClientApplication.AcquireTokenSilentAsync(
credentials.ApiScopes.Split(' '),
account,
credentials.Authority,
false);
return authenticationResult.AccessToken;
}
else
{
return "";
}
}
问题在于,重新启动应用程序时,用户仍通过ADB2C cookie进行身份验证,但是...
using (var request = new HttpRequestMessage(HttpMethod.Get, address.AbsoluteUri))
{
if (this.HasCredentials())
{
string accessToken = await this._getAccessToken(_confidentialClientCredentials);
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
}
using (HttpResponseMessage response = await this.SendAsync(request))
{
//result-processing logic
}
...
返回null。这可能是因为令牌缓存在应用程序重启时被破坏了,所以我可能可以使用Redis缓存进行修复。
但是,我的主要问题是如何处理具有空帐户但同时被“认证”的情况。即使我有一个空帐户,如何验证对我的网站的请求?例如,它是否应该失败并重定向到登录页面?
我尝试查看“授权”过滤器,并使用以下代码连接到auth进程,并验证那里的用户是否为null,但无济于事。永远不会调用以下事件(在ConfigureServices中):
confidentialClientApplication.GetAccountsAsync().Result.FirstOrDefault();
对于我来说,一切都太抽象了,无法理解正在发生的事情。要么是这样,否则我会缺少一些基本知识。
注意:错误“ 在AcquiretokenSilent API中传递了空用户。传递用户对象或调用acquireToken进行身份验证。
如果我尝试将空帐户传递给services.AddAuthentication(AzureADB2CDefaults.AuthenticationScheme)
.AddAzureADB2C(options => Configuration.Bind("ActiveDirectoryB2C", options))
.AddAzureADB2CBearer(options => Configuration.Bind("ActiveDirectoryB2C", options))
.AddCookie((options) => new CookieAuthenticationOptions
{
Events = new CookieAuthenticationEvents
{
OnValidatePrincipal = context =>
{
// context.Principal gives you access to the logged-in user
// context.Properties.GetTokens() gives you access to all the tokens
return Task.CompletedTask;
},
OnSignedIn = context =>
{
return Task.CompletedTask;
}
}
});
方法,则会引发“”。
答案 0 :(得分:0)
我用以下代码解决了
protected override void OnException(ExceptionContext filterContext)
{
if (filterContext.Exception is Microsoft.Identity.Client.MsalUiRequiredException)
{
RedirectToAction("SignIn", "Account");
}
else {
//Do your logging
// ...
}
}
我将寻找更好的解决方案。