资源服务器中的 ASP.NET 5 JWT 令牌验证

Posted

技术标签:

【中文标题】资源服务器中的 ASP.NET 5 JWT 令牌验证【英文标题】:ASP.NET 5 JWT Token validation in resource server 【发布时间】:2016-06-09 21:54:28 【问题描述】:

我使用asp.net 5 rc-1JWT tokens 创建了一个身份验证服务器

这是我的startup.cs 代码

var key = new RsaSecurityKey(new RSACryptoServiceProvider(2048).ExportParameters(true));
TokenAuthOptions tokenOptions = new TokenAuthOptions()

    Audience = "webappname",
    Issuer = "http://webappname.com",
    Key = key,
    SigningCredentials = new SigningCredentials(key, SecurityAlgorithms.RsaSha512Signature)
;

app.UseJwtBearerAuthentication(options =>

    options.TokenValidationParameters.IssuerSigningKey = tokenOptions.Key;
    options.TokenValidationParameters.ValidAudience = tokenOptions.Audience;
    options.TokenValidationParameters.ValidIssuer = tokenOptions.Issuer;
    options.TokenValidationParameters.ValidateSignature = true;
    options.TokenValidationParameters.ValidateLifetime = true;

    options.TokenValidationParameters.ClockSkew = TimeSpan.FromMinutes(0);
);

并在同一个项目中创建了一个 MVC 控制器OAuthController.cs 来获取令牌

[HttpGet, Route("Signin")]
public dynamic Signin(string un, string pw)

    if (valid user)
    
        DateTime? expires = DateTime.UtcNow.AddMinutes(5);
        var token = GetToken(un, expires);
        return new  authenticated = true, entityId = 1, token = token, tokenExpires = expires ;
    
    return new  authenticated = false ;


private string GetToken(string user, DateTime? expires)

    var handler = new JwtSecurityTokenHandler();

    ClaimsIdentity identity = new ClaimsIdentity(new GenericIdentity(user, "TokenAuth"), new[]  new Claim("EntityID", "1", ClaimValueTypes.Integer) );

    identity.AddClaim(new Claim(ClaimTypes.Role, "Admin2"));

    var securityToken = handler.CreateToken(
            issuer: _tokenOptions.Issuer,
            audience: _tokenOptions.Audience,
            signingCredentials: _tokenOptions.SigningCredentials,
            subject: identity,
            expires: expires
        );
    return handler.WriteToken(securityToken);

现在,当我使用用户名和密码调用方法 Signin 时,我得到了 jwt 令牌作为响应,它可以访问同一应用程序中的 [Authorize("Bearer", Roles="Admin2")] 控制器方法。

如何使用相同的令牌验证不同的应用程序

【问题讨论】:

【参考方案1】:

您的第二个应用只需要访问用于签署令牌的相同 RSA 密钥。然后,您可以通过与第一个应用完全相同的方式配置 app.UseJwtBeaerAuthentication 方法,在第二个应用中使用令牌。

【讨论】:

以上是关于资源服务器中的 ASP.NET 5 JWT 令牌验证的主要内容,如果未能解决你的问题,请参考以下文章

asp.net 核心中的 jwt 令牌无效

ASP.NET Core Web Api之JWT刷新Token

ASP.NET Core 中的 Jwt 令牌身份验证

Asp.Net Web API JWT 身份验证

从 ASP.NET Core 中的 API 读取 JWT 令牌

从 ASP.NET Core 中的不同 HTTP 标头读取 JWT 令牌