我正在使用ASP.NET Core和Azure AD B2C,当使用来自GitHub(active-directory-dotnet-webapp-openidconnect-aspnetcore-b2c)的代码示例时,注销部分不起作用。 在帐户控制器
[HttpGet]
public async Task LogOff()
{
if (HttpContext.User != null && HttpContext.User.Identity.IsAuthenticated)
{
string scheme = (HttpContext.User.FindFirst("http://schemas.microsoft.com/claims/authnclassreference"))?.Value;
await HttpContext.Authentication.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
await HttpContext.Authentication.SignOutAsync(scheme.ToLower(), new AuthenticationProperties { RedirectUri = "/" });
}
}
该方案返回null值。我找不到正确注销的方法。任何帮助将不胜感激。
答案 0 :(得分:2)
您的代码正在寻找“acr”声明并且显然找不到声明。 打开Azure门户并导航到Azure AD B2C,然后检查登录/注册策略的每个中的“令牌,会话和SSO配置”部分。 在令牌兼容性设置下,您应该具有以下开关:
如果交换机选择了tfp(默认位置),则auth令牌将不包含“acr”声明,因此在登录后不会将其添加到ClaimsPrincipal对象的声明集合中,并且随后LogOff方法中的代码不可用。 希望这会有所帮助。
答案 1 :(得分:0)
亚历克斯是对的。如果不修改代码,则应将表示更改为“acr”。
但是,“acr”仅用于向后兼容性,Microsoft建议应使用“tfp”。 Azure Active Directory B2C: Token, session and single sign-on configuration
我建议您修改示例代码,如下所示。我也submitted a pull request给了原作者类似的代码。
if (HttpContext.User != null && HttpContext.User.Identity.IsAuthenticated)
{
// try to find the tfp policy id claim (default)
var scheme = (HttpContext.User.FindFirst("tfp"))?.Value;
// fall back to legacy acr policy id claim
if (string.IsNullOrEmpty(scheme))
scheme = (HttpContext.User.FindFirst("http://schemas.microsoft.com/claims/authnclassreference"))?.Value;
await HttpContext.Authentication.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
await HttpContext.Authentication.SignOutAsync(scheme.ToLower(), new AuthenticationProperties { RedirectUri = "/" });
}