繁体   English   中英

User.Identity.IsAuthenticated 在使用 ITFoxtec 的 SAML 2.0 中始终为假

[英]User.Identity.IsAuthenticated Always false in SAML 2.0 using ITFoxtec

我在我的 Dotnet 3.1 项目中使用 itfoxtec-identity-saml2。 我正在从服务器发起请求并验证登录,直到这里一切正常。

从服务器获得响应断言并转换声明并创建 session 但我的应用程序仍然无法登录。

以下是我的代码片段供参考。

AuthController.cs

 [Route("AssertionConsumerService")]
    public async Task<IActionResult> AssertionConsumerService()
    {
        try
        {
            var binding = new Saml2PostBinding();
            var saml2AuthnResponse = new Saml2AuthnResponse(config);
            binding.ReadSamlResponse(Request.ToGenericHttpRequest(), saml2AuthnResponse);
            if (saml2AuthnResponse.Status != Saml2StatusCodes.Success)
            {
                throw new AuthenticationException($"SAML Response status: {saml2AuthnResponse.Status}");
            }
            binding.Unbind(Request.ToGenericHttpRequest(), saml2AuthnResponse);

            await saml2AuthnResponse.CreateSession(HttpContext, claimsTransform: (claimsPrincipal) => ClaimsTransform.TransformClaims(claimsPrincipal),isPersistent:true, lifetime: new TimeSpan(1, 0, 0));

            var auth = HttpContext.User.Identity.IsAuthenticated;
        }
        catch (Exception ex)
        {

        }

        return Redirect("~/");


    }

ClaimsTransform.cs

public static ClaimsPrincipal TransformClaims(ClaimsPrincipal claimsPrincipal)
    {
        ClaimsIdentity identity = (ClaimsIdentity)claimsPrincipal.Identity;
        var tenantId = identity.FindFirst(ClaimTypes.NameIdentifier);
        var Name = identity.FindFirst("firstName");
        var firstName = identity.FindFirst("firstName");
        var Email = identity.FindFirst("Email");
        var UserID = identity.FindFirst("UserID");
        
        
        var claimsToKeep = new List<Claim> { tenantId, Name,firstName, Email, UserID };

        var newIdentity = new ClaimsIdentity(claimsToKeep, identity.AuthenticationType, ClaimTypes.NameIdentifier, ClaimTypes.Role);
        ClaimsPrincipal newClaims = new ClaimsPrincipal(newIdentity);


        return new ClaimsPrincipal(new ClaimsIdentity(claimsToKeep, identity.AuthenticationType, ClaimTypes.Name, ClaimTypes.Role)
        {
            BootstrapContext = ((ClaimsIdentity)claimsPrincipal.Identity).BootstrapContext
        });

        //return newClaims;
    }

毕竟,我的应用程序正在重定向回登录页面,而不是登录用户的应用程序主页。

帮助将不胜感激。

您需要将用户身份声明设置为声明集中存在的声明,否则用户不会被接受为已通过身份验证。

如果例如。 tenantId 声明是用户身份,然后用户身份声明是 new ClaimTypes.NameIdentifier new ClaimsPrincipal(... ClaimTypes.NameIdentifier, ClaimTypes.Role)

ClaimsTransform.cs

public static ClaimsPrincipal TransformClaims(ClaimsPrincipal claimsPrincipal)
{
    ClaimsIdentity identity = (ClaimsIdentity)claimsPrincipal.Identity;
    var tenantId = identity.FindFirst(ClaimTypes.NameIdentifier);
    var Name = identity.FindFirst("firstName");
    var firstName = identity.FindFirst("firstName");
    var Email = identity.FindFirst("Email");
    var UserID = identity.FindFirst("UserID");
    
    
    var claimsToKeep = new List<Claim> { tenantId, Name,firstName, Email, UserID };         
    return new ClaimsPrincipal(new ClaimsIdentity(claimsToKeep, identity.AuthenticationType, ClaimTypes.NameIdentifier, ClaimTypes.Role)
    {
        BootstrapContext = ((ClaimsIdentity)claimsPrincipal.Identity).BootstrapContext
    });
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM