在ASP.NET Core中填充和访问ClaimsIdentity

时间:2018-06-11 23:01:57

标签: asp.net asp.net-core

我有一个.NET Core 2.1应用程序,我有一个身份验证处理程序,我用它来提取标题的值。

如何将此值添加到我的ClaimsIdentity,然后如何从我的控制器访问它?

我有以下代码适用于我的所有控制器操作:

public class CustomAuthHandler : AuthenticationHandler<CustomAuthOptions>
{
    public CustomAuthHandler(IOptionsMonitor<CustomAuthOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock)
        : base(options, logger, encoder, clock)
    {
    }

    protected override Task<AuthenticateResult> HandleAuthenticateAsync()
    {
        // Get Authorization header value
        if (!Request.Headers.TryGetValue(HeaderNames.Authorization, out var authorization))
        {
            return Task.FromResult(AuthenticateResult.Fail("Cannot read authorization header."));
        }

        var key = authorization.FirstOrDefault() ?? "";

        var token = JsonConvert.DeserializeObject<Token>(authorization);

        var identities = new List<ClaimsIdentity> { new ClaimsIdentity("custom auth type") };
        var ticket = new AuthenticationTicket(new ClaimsPrincipal(identities), Options.Scheme);

        return Task.FromResult(AuthenticateResult.Success(ticket));
    }
}

我认为我需要做的是将我的令牌变量传递给我的ClaimsIdentity?如果是这样,我该怎么做,然后如何从我的API控制器访问我的声明?

1 个答案:

答案 0 :(得分:0)

您不会向自己的身份添加任何声明,并且您将多个身份作为奖励返回。

身份验证处理程序负责创建完整的身份,而不是附加单个声明,并且不清楚您想要的声明。如果您的令牌是关于身份的唯一真实来源,那么您将创建一个如此身份的身份

var claims = new[]
{
    new Claim("myClaimName","valueExtractedFromToken")
};

var principal = new ClaimsPrincipal(new ClaimsIdentity(claims, context.Scheme.Name));
var ticket = new AuthenticationTicket(validateCertificateContext.Principal, Scheme.Name);
return AuthenticateResult.Success(ticket);

https://github.com/blowdart/idunno.Authentication有几个例子,我在这里举例说明基本身份验证和证书身份验证。

如果身份验证由其他人处理,并且您只想添加声明(例如,您有cookie身份验证,则每个处理程序的选项类中都有事件,您可以在身份验证运行后添加自己的代码添加对现有身份的声明。