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 实时重新加载

如何在 Asp.Net 5 (MVC 6) 中使用实体框架 6.x

如何在 asp.net 4.5 中使用 facebook 帐户开发登录

使用asp.net 5时如何更改登录网址

Asp.Net 5 项目托管

如何在 ASP.NET Core 5 MVC (.NET 5) 中获取记录的用户数据?