1

我无法弄清楚如何从 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);
    }
4

1 回答 1

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
    });
}
于 2019-06-20T05:34:56.210 回答