ASP.NET 5 中使用 OAuthBearerAuthentication 的 JWT 身份验证
Posted
技术标签:
【中文标题】ASP.NET 5 中使用 OAuthBearerAuthentication 的 JWT 身份验证【英文标题】:JWT Authentication in ASP.NET 5 using OAuthBearerAuthentication 【发布时间】:2015-12-29 10:29:42 【问题描述】:我正在开发一个 ASP.NET 5 应用程序,我想使用 JWT 来保护应用程序中的某些端点。暂时我们已经决定我们(而不是第三方)将发布 JWT,因为我们所有的客户都由应用程序“拥有”,即我们没有“外部”客户。在示例中,我有一个端点,它使用 jwt-dotnet 库创建并返回 JWT,如下所示(我很欣赏这是一个 基本示例,没有过期时间和单个主题声明等。 ):
...
// include a single subject claim (user id)
var claims = new Dictionary<string, object>() "sub", "1234" ;
var key = "EXAMPLE_SECRET_KEY_TO_SIGN_JWT";
var token = JWT.JsonWebToken.Encode(claims, key, JWT.JwtHashAlgorithm.HS256);
...
// return JWT
我可以使用与预期相同的密钥对该 JWT 进行编码和解码。在我的 Startup.cs 文件中,我使用 Microsoft.AspNet.Authentication.OAuthBearer 中间件来授权我的控制器中指定了 [Authorize] 属性的相关路由。但是,在查看了包括here 和here 在内的许多帖子之后,我似乎找不到如何以相同方式将此签名密钥提供给OAuth 中间件的示例。我的 Startup.cs 文件中的代码如下所示:
public class Startup
public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
app.UseErrorPage();
app.UseOAuthBearerAuthentication();
app.UseMvc();
...
public void ConfigureServices(IServiceCollection services)
services.Configure<OAuthBearerAuthenticationOptions>(bearer =>
bearer.AutomaticAuthentication = true;
bearer.TokenValidationParameters.ValidAudience = "Example audience";
bearer.TokenValidationParameters.ValidIssuer = "Example issuer";
bearer.TokenValidationParameters.ValidateAudience = true;
bearer.TokenValidationParameters.ValidateIssuer = true;
bearer.TokenValidationParameters... // how do I set the signing key as a string literal?
);
services.AddMvc();
我的假设是我应该能够简单地向中间件提供相同的字符串文字密钥,以便它可以验证令牌签名。然而,情况似乎并非如此,因为示例讨论了使用 RSA 密钥或证书,而不是提供单个密钥/字符串文字。
我很感激我可能在这里遗漏了一些东西,或者确实这可能是错误的方法,我不应该这样做!
【问题讨论】:
【参考方案1】:编辑:对称密钥现在在 RC2 nightly builds 中原生支持:
var key = Convert.FromBase64String("base64-encoded symmetric key");
app.UseJwtBearerAuthentication(options =>
options.AutomaticAuthenticate = true;
options.AutomaticChallenge = true;
options.Authority = Configuration["jwt:authority"];
options.Audience = Configuration["jwt:audience"];
options.TokenValidationParameters.IssuerSigningKey = new SymmetricSecurityKey(key);
);
你不能,至少不能没有一点管道:OAuth2 承载中间件依赖于 IdentityModel 5,它不支持像你在第一个 sn-p 中使用的对称密钥。
当然,最终会支持对称密钥 (https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/issues/250),但同时建议使用非对称密钥(如 RSA 密钥)。
您也可以自己实现对称密钥支持(请参阅https://gist.github.com/sandorfr/4039d540b6b552154522),但使用 RSA 密钥绝对是更好的选择。
【讨论】:
感谢您的回答。目前不支持对称密钥有点令人沮丧,但是我将研究生成一个 RSA 密钥并从那里开始。干杯。 @corkington 我更新了我的答案,提到现在支持 OTB 对称密钥(您需要 RC2 每晚构建)。 感谢您抽出宝贵时间编辑答案并发表评论,会看看。以上是关于ASP.NET 5 中使用 OAuthBearerAuthentication 的 JWT 身份验证的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Asp.Net 5 (MVC 6) 中使用实体框架 6.x