使用OAuthBearerAuthentication在ASP.NET 5中进行JWT身份验证

我正在开发一个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]属性的相关路由.但是,在查看了包括herehere在内的一些帖子之后,我似乎无法找到如何以相同的方式向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密钥或证书而不是提供单个密钥/字符串文字.

我很欣赏我可能在这里遗漏了一些东西,或者确实这可能是错误的方法,我不应该这样做!

最佳答案 编辑:RC2夜间版本现在支持对称密钥:

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,它不支持你在第一个代码片段中使用的对称密钥.

当然,最终会支持对称密钥(https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/issues/250),但与此同时,建议使用非对称密钥(如RSA密钥).

您也可以自己实现对称密钥支持(参见https://gist.github.com/sandorfr/4039d540b6b552154522),但使用RSA密钥肯定是更好的选择.

点赞