【问题标题】:JWT bearer tokens w/ ASP.NET Identity 3带有 ASP.NET Identity 3 的 JWT 不记名令牌
【发布时间】:2016-03-06 01:07:45
【问题描述】:

基于 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 Identity 的完整解决方案。我修改了 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 Identity?

【问题讨论】:

  • 这方面有什么更新吗?我无法获得signInManager,也无法获得`_userManager。也许他们被注射了?

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


【解决方案1】:

你的实现看起来不错,小三评论:

  • 您应该使用async/await 来避免.Result 阻塞调用。
  • 您应该考虑按照 OAuth2 规范的要求实施蛮力对策:https://www.rfc-editor.org/rfc/rfc6749#section-4.3.2。您可以使用 Identity 3 轻松做到这一点,因为它提供了对“锁定”的原生支持。
  • 您必须记住,此实现将导致序列化与用户关联的所有声明(甚至是自定义声明),其中可能包括机密数据。

最后两点在 OpenIddict(一个全新的实验性 OIDC 服务器,内部使用 AspNet.Security.OpenIdConnect.Server)中得到了缓解,所以不要犹豫,看看它的默认实现:https://github.com/openiddict/core/blob/dev/src/OpenIddict.Core/OpenIddictProvider.cs#L353

【讨论】:

    猜你喜欢
    • 2020-10-19
    • 2016-11-20
    • 2016-09-25
    • 1970-01-01
    • 2022-11-26
    • 2015-08-13
    • 2020-08-31
    • 2016-03-06
    • 2017-10-26
    相关资源
    最近更新 更多