【问题标题】:itfoxtex saml mvccore, attribute replace NameIDitfoxtex saml mvccore,属性替换 NameID
【发布时间】:2019-06-19 19:59:13
【问题描述】:

我不知道如何从 saml 响应中获取属性来代替 NameID 值。 我的 IDP 团队在属性中返回我需要的值,而不是在 NameID 中(他们不会让步)。

感谢您的帮助!

我正在运行 MVC 核心。我已经为 IT​​foxtec.Identity.Saml2 的示例“TestWebAppCore”中的 NameID 设置并运行了所有内容。

我正在尝试获取此值来代替会话用户名的 NameID:

saml:AttributeStatement>
        <saml:Attribute Name="valueName"

NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified"
                        >
            <saml:AttributeValue>IDValue</saml:AttributeValue>
        </saml:Attribute>
    </saml:AttributeStatement>

[Route("AssertionConsumerService")]
    public async Task<IActionResult> AssertionConsumerService()
    {
        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);
        try {
            await saml2AuthnResponse.CreateSession(HttpContext, 
claimsTransform: (claimsPrincipal) => 
ClaimsTransform.Transform(claimsPrincipal));
        }
        catch (Exception ex) {
            log.writeLog(ex.Message.ToString());
        }

        var relayStateQuery = binding.GetRelayStateQuery();
        var returnUrl = relayStateQuery.ContainsKey(relayStateReturnUrl) 
? relayStateQuery[relayStateReturnUrl] : Url.Content("~/");

        return Redirect(returnUrl);
    }

【问题讨论】:

    标签: asp.net-core saml-2.0 itfoxtec-identity-saml2


    【解决方案1】:

    没有 NameID 可能无法注销,但没有 NameID 可以登录。

    在 .NET 中,NameID 被转换为 ClaimTypes.NameIdentifier 声明。用户声明在ClaimsTransform.CreateClaimsPrincipal 方法中处理。

    您可以将传入的自定义声明 "valueName" 转换为 ClaimTypes.NameIdentifier 声明:

    private static ClaimsPrincipal CreateClaimsPrincipal(ClaimsPrincipal incomingPrincipal)
    {
        var claims = new List<Claim>();
    
        claims.AddRange(GetSaml2LogoutClaims(incomingPrincipal));
        claims.Add(new Claim(ClaimTypes.NameIdentifier, GetClaimValue(incomingPrincipal, "valueName")));
    
        return new ClaimsPrincipal(new ClaimsIdentity(claims, incomingPrincipal.Identity.AuthenticationType, ClaimTypes.NameIdentifier, ClaimTypes.Role)
        {
            BootstrapContext = ((ClaimsIdentity)incomingPrincipal.Identity).BootstrapContext
        });
    }
    

    或将ClaimsIdentity 中的身份声明更改为传入的自定义声明"valueName"

    private static ClaimsPrincipal CreateClaimsPrincipal(ClaimsPrincipal incomingPrincipal)
    {
        var claims = new List<Claim>();
    
        // All claims
        claims.AddRange(incomingPrincipal.Claims);
    
        return new ClaimsPrincipal(new ClaimsIdentity(claims, incomingPrincipal.Identity.AuthenticationType, "valueName", ClaimTypes.Role)
        {
            BootstrapContext = ((ClaimsIdentity)incomingPrincipal.Identity).BootstrapContext
        });
    }
    

    【讨论】:

    • 我昨晚刚刚解决了这个问题。您的选项 1 将 valueName 转换为 NameIdentifier 正是我在意识到那部分后所做的。非常感谢您的回复验证!
    猜你喜欢
    • 2015-09-14
    • 2012-04-23
    • 2018-10-19
    • 2017-10-18
    • 2014-12-05
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多