提问者:小点点

ASP.NET 5中使用OAuthBearerAuthentication的JWT身份验证


我正在开发 ASP.NET 5 应用程序,我想使用 JWT 来保护应用程序中的某些endpoint。目前,我们决定(而不是第三方)将发布JWT,因为我们所有的客户端都由应用程序“拥有”,即我们没有“外部”客户端。在示例中,我有一个endpoint,它使用 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] 属性。但是,在查看了包括此处和此处在内的许多帖子后,我似乎找不到如何以相同的方式向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夜间构建中本机支持:

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承载中间件依赖于IdtyModel 5,它不支持像你在第一个片段中使用的对称密钥。

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

也可以自己实现对称密钥支持(见https://gist . github . com/sandorfr/4039d 540 b 6b 552154522),但是使用RSA密钥绝对是更好的选择。