1

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

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

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

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;
    }

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

帮助将不胜感激。

4

1 回答 1

1

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

如果例如。tenantId 声明是用户身份,然后用户身份声明ClaimTypes.NameIdentifiernew 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
    });
}
于 2021-02-08T21:25:48.777 回答