首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >User.Identity.IsAuthenticated在SAML2.0中使用ITFoxtec总是错误的

User.Identity.IsAuthenticated在SAML2.0中使用ITFoxtec总是错误的
EN

Stack Overflow用户
提问于 2021-02-08 19:30:11
回答 1查看 582关注 0票数 1

我在我的DotNet3.1项目中使用itfoxtec-identity-saml2 2。我正在启动从服务器的请求,并验证登录,直到这里,一切都很好。

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

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

AuthController.cs

代码语言:javascript
复制
 [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

代码语言:javascript
复制
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;
    }

在此之后,我的应用程序将重定向回登录页面,而不是登录用户的应用程序主页。

我们会感谢你的帮助。

EN

回答 1

Stack Overflow用户

发布于 2021-02-08 21:25:48

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

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

ClaimsTransform.cs

代码语言:javascript
复制
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
    });
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66108103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档