itfoxtex saml mvccore, атрибут заменяет NameID - PullRequest
1 голос
/ 19 июня 2019

Я не могу понять, как получить атрибут из ответа saml вместо значения NameID. Моя команда IDP возвращает значение, которое мне нужно, в атрибуте, а не в NameID (который они не планируют).

Спасибо за любую помощь!

Я использую MVC Core. У меня все настроено и запущено для NameID из примера «TestWebAppCore» для ITfoxtec.Identity.Saml2.

Я пытаюсь получить это значение вместо 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);
    }

1 Ответ

0 голосов
/ 20 июня 2019

Возможно, невозможно выйти без 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
    });
}
...