具有ASP.NET身份3的JWT承载令牌

时间:2015-12-01 22:55:20

标签: asp.net-core openid-connect bearer-token asp.net-identity-3 aspnet-contrib

基于Shaun Luttin在https://stackoverflow.com/a/30857524的优秀示例,我能够使用该代码生成和使用承载令牌。微小的变化是获得最新的包:

"dependencies": {
  "Microsoft.AspNet.Authentication.JwtBearer": "1.0.0-rc1-final",
  "AspNet.Security.OpenIdConnect.Server": "1.0.0-beta4"
}

尽管代码是一个很好的开始,但它并不是一个完全集成w / ASP.NET身份的完整解决方案。我按如下方式修改了AuthorizationProvider类:

public override Task GrantResourceOwnerCredentials(
    GrantResourceOwnerCredentialsContext context)
{
    var user = _userManager.FindByNameAsync(context.UserName).Result;
    if (user == null)
    {
        context.Rejected("The user name or password is incorrect.");
    }
    else
    {
        var signInManager = context.HttpContext.RequestServices
            .GetRequiredService<SignInManager<ApplicationUser>>();

        if (signInManager.CanSignInAsync(user).Result &&
            _userManager.CheckPasswordAsync(user, context.Password).Result)
        {
            var principal = signInManager.CreateUserPrincipalAsync(user).Result;

            //To avoid leaking confidential data, AspNet.Security.OpenIdConnect.Server
            //refuses to serialize the claims that don't explicitly specify a destination.
            foreach (var claim in principal.Claims)
                claim.WithDestination("token id_token");

            context.Validated(principal);
        }
        else
            context.Rejected("The user name or password is incorrect.");
    }

    return Task.FromResult(0);
}

我正在使用CreateUserPrincipalAsync为Validated方法创建ClaimsPrincipal。是否有更好的方法来集成w / ASP.NET身份?

1 个答案:

答案 0 :(得分:2)

您的实施看起来很好,次要的3条评论:

  • 您应该使用async/await来避免.Result阻止来电。
  • 您应该考虑按照OAuth2规范的要求实施强力对策:https://tools.ietf.org/html/rfc6749#section-4.3.2。这可以通过Identity 3轻松完成,因为它为&#34;锁定&#34;提供原生支持。
  • 您必须记住,此实施将导致序列化与用户关联的所有声明(甚至是自定义声明),其中可能包含机密数据。

OpenIddict(一个内部使用AspNet.Security.OpenIdConnect.Server的全新实验性OIDC服务器)缓解了最后两点,因此请不要犹豫,看看其默认实现:{{ 3}}