在Azure AD B2C和ASP.NET Core上注销时出现问题

时间:2016-11-07 20:21:22

标签: azure-ad-b2c

我正在使用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值。我找不到正确注销的方法。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

您的代码正在寻找“acr”声明并且显然找不到声明。 打开Azure门户并导航到Azure AD B2C,然后检查登录/注册策略的每个中的“令牌,会话和SSO配置”部分。 在令牌兼容性设置下,您应该具有以下开关:

enter image description here

如果交换机选择了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 = "/" });
        }