在dotnet core 1.1 asp中,我能够通过执行以下操作来配置和使用身份中间件和jwt中间件:
app.UseIdentity();
app.UseJwtBearerAuthentication(new JwtBearerOptions() {});
这一点现在已经发生了变化,因为我们通过以下方式实现了中间件:
app.UseAuthentication();
设置的配置通过Startup的ConfigureServices部分完成.反恐精英.
迁移文档中有一些关于使用授权模式的参考:
在2.0项目中,身份验证是通过服务配置的.每个
此外,还提到:
设置默认身份验证方案
在1.x、 自动验证和自动挑战特性
在2.0中,这两个属性
或者,使用AddAuthentication的重载版本 方法设置多个属性.在以下重载的 方法示例中,默认方案设置为 CookieAuthenticationDefaults.AuthenticationScheme.身份验证 也可以在您的个人内部指定方案 [授权]属性或授权策略.
在dotnet core 2.0中仍然可以使用多个身份验证模式吗?我无法获得尊重JWT配置("承载"模式)的策略,目前只有Identity在使用这两种配置.我找不到多个身份验证模式的任何示例.
编辑:
我重新阅读了文档,现在了解到:
app.UseAuthentication()
根据默认架构添加自动身份验证.Identity为您配置默认架构.
通过在Startup中执行以下操作,我绕过了这个问题,这看起来像是针对新api的黑客攻击.cs配置:
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();
});
这是正确的方法吗?还是我应该利用IAAuthenticationSchemeProvider定制实现的框架、DI和接口?
编辑-实现的更多细节以及在哪里可以找到它.
JWT配置可以在这里找到,我正在使用策略定义授权,其中包括接受的身份验证模式:
https://github.com/Arragro/ArragroCMS/blob/master/src/ArragroCMS.Management/Startup.cs个
自定义中间件仍然是实现的.身份验证控制器位于以下位置:
它使用应用程序生成的API密钥来获得对数据的只读访问权限.您可以在此处找到使用该策略的控制器的实现:
将DB连接字符串更改为指向SQL Server,然后运行应用程序.它会自动迁移数据库并配置管理员用户(support@arragro.com-ArragroPassword1!).然后转到菜单栏中的设置选项卡,单击"配置JWT只读API密钥设置"以获取密钥.在postman中,通过配置新选项卡并将其设置为使用以下地址发布,获取jwt令牌:
http://localhost:5000/api/auth/readonly-token
提供标题:Content-Type:Application/json
供应身体:
{
"apiKey": "the api token from the previous step"
}
复制响应中的令牌,然后在Postman中使用以下内容:
http://localhost:5000/api/sitemap/flat
Authorization: "bearer - The token you received in the previous request"
由于有了自定义中间件,它将在初始状态下工作.注释掉上面提到的代码,然后重试,您将收到401.
编辑-@DonnyTian下面的回答在他的 comments 中涵盖了我的解决方案.我遇到的问题是在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());
});
按照建议,这在没有定制中间件的情况下也可以工作.