【发布时间】:2018-01-28 10:34:31
【问题描述】:
在 dotnet core 1.1 asp 中,我能够通过执行以下操作来配置和使用身份中间件和 jwt 中间件:
app.UseIdentity();
app.UseJwtBearerAuthentication(new JwtBearerOptions() {});
这已经改变了,我们使用以下实现中间件:
app.UseAuthentication();
设置的配置是通过 Startup.cs 的 ConfigureServices 部分完成的。
迁移文档中有一些关于使用授权模式的参考:
在 2.0 项目中,身份验证是通过服务配置的。每个 身份验证方案在 ConfigureServices 方法中注册 启动.cs。 UseIdentity 方法被替换为 UseAuthentication。
另外还有一个参考:
设置默认身份验证方案
在 1.x 中,AutomaticAuthenticate 和 AutomaticChallenge 属性 旨在设置在单个身份验证方案上。有 没有很好的方法来执行这一点。
在 2.0 中,这两个属性已经 作为单个 AuthenticationOptions 实例上的标志删除,并且 已移至基本 AuthenticationOptions 类。属性 可以在 AddAuthentication 方法调用中配置 Startup.cs 的 ConfigureServices 方法:
或者,使用 AddAuthentication 的重载版本 方法来设置多个属性。在下面重载 方法示例,默认方案设置为 CookieAuthenticationDefaults.AuthenticationScheme。认证 方案也可以在您的个人中指定 [授权] 属性或授权策略。
在 dotnet core 2.0 中是否仍然可以使用多个身份验证模式?我无法获得尊重 JWT 配置(“Bearer”模式)的策略,并且目前只有 Identity 与这两个配置一起工作。我找不到多个身份验证模式的任何示例。
编辑:
我重新阅读了文档,现在明白了:
app.UseAuthentication()
添加针对默认架构的自动身份验证。 Identity 为您配置默认架构。
通过在 Startup.cs 配置中执行以下操作,我已经解决了似乎针对新 api 的黑客攻击的问题:
app.UseAuthentication();
app.Use(async (context, next) =>
{
if (!context.User.Identity.IsAuthenticated)
{
var result = await context.AuthenticateAsync(JwtBearerDefaults.AuthenticationScheme);
if (result?.Principal != null)
{
context.User = result.Principal;
}
}
await next.Invoke();
});
这是执行此操作的正确方法,还是我应该利用框架、DI 和接口来自定义 IAuthenticationSchemeProvider 的实现?
编辑 - 实现的更多细节以及在哪里可以找到它。
JWT 配置可以在这里找到,我正在使用策略来定义授权,其中包括接受的身份验证模式:
https://github.com/Arragro/ArragroCMS/blob/master/src/ArragroCMS.Management/Startup.cs
自定义中间件仍在实施。 Auth 控制器在这里:
它使用应用程序生成的 API 密钥来获得对数据的只读访问权限。您可以在此处找到使用该策略的控制器的实现:
更改数据库连接字符串以指向您的 SQL Server,然后运行应用程序。它会自动迁移数据库并配置管理员用户 (support@arragro.com - ArragroPassword1!)。然后转到菜单栏中的“设置”选项卡并单击“配置 JWT ReadOnly API 密钥设置”以获取密钥。在 postman 中,通过配置新选项卡并将其设置为 POST 并使用以下地址获取 jwt 令牌:
http://localhost:5000/api/auth/readonly-token
提供标头:Content-Type: application/json
供应身体:
{
"apiKey": "the api token from the previous step"
}
复制响应中的令牌,然后在邮递员中使用以下内容:
http://localhost:5000/api/sitemap/flat
Authorization: "bearer - The token you received in the previous request"
由于自定义中间件,它最初可以工作。把上面提到的代码注释掉,再试一次,就会收到401。
编辑 -@DonnyTian 下面的回答涵盖了我在他的 cmets 中的解决方案。我遇到的问题是在 UseMvc 上设置默认策略,但不提供架构:
services.AddMvc(config =>
{
var defaultPolicy = new AuthorizationPolicyBuilder(new[] { JwtBearerDefaults.AuthenticationScheme, IdentityConstants.ApplicationScheme })
.RequireAuthenticatedUser()
.Build();
config.Filters.Add(new AuthorizeFilter(defaultPolicy));
config.Filters.Add(new AutoValidateAntiforgeryTokenAttribute());
config.Filters.Add(new ValidateModelAttribute());
});
按照建议,这无需自定义中间件即可工作。
【问题讨论】:
-
在 ConfigureServices 中分享您的 JWT 配置代码。
-
此代码可在此处获得:github.com/Arragro/ArragroCMS/blob/master/src/…。当前使用自定义中间件的实现确实有效,但我更希望策略/身份验证属性上的模式实现
标签: asp.net authentication asp.net-identity .net-core jwt