在dotnet core 1.1 asp中,我能够通过执行以下操作来配置和使用身份中间件和jwt中间件:

  app.UseIdentity();
  app.UseJwtBearerAuthentication(new JwtBearerOptions() {});

这一点现在已经发生了变化,因为我们通过以下方式实现了中间件:

   app.UseAuthentication();

设置的配置通过Startup的ConfigureServices部分完成.反恐精英.

迁移文档中有一些关于使用授权模式的参考:

https://docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/identity-2x#authentication-middleware-and-services

在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

自定义中间件仍然是实现的.身份验证控制器位于以下位置:

https://github.com/Arragro/ArragroCMS/blob/master/src/ArragroCMS.Web.Management/ApiControllers/AuthController.cs

它使用应用程序生成的API密钥来获得对数据的只读访问权限.您可以在此处找到使用该策略的控制器的实现:

https://github.com/Arragro/ArragroCMS/blob/master/src/ArragroCMS.Web.Management/ApiControllers/SitemapController.cs

将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());
    });

按照建议,这在没有定制中间件的情况下也可以工作.

推荐答案

ASP.NET Core 2.0绝对支持多种身份验证方案. 您可以try 在Authorize属性中指定模式,而不是使用身份验证中间件进行黑客攻击:

[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]

我试了试,效果很好.假设您同时添加了Identity和JWT,如下所示:

services.AddIdentity<ApplicationUser, ApplicationRole>()
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)

由于AddIdentity()已经将cookie身份验证设置为默认模式,我们必须在控制器的Authorize属性中指定模式.目前,我不知道如何覆盖设置为AddIdentity()的默认模式,或者我们最好不要这样做.

一种解决办法是编写一个从Authorize派生的新类(您可以将其称为JwtAuthorize),并将Bearer作为默认模式,因此您不必每次都指定它.

UPDATE

找到了覆盖默认身份验证方案的方法!

而不是在下面一行:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)

使用以下重载设置默认架构:

services.AddAuthentication(option =>
                {
                    option.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                })
                .AddJwtBearer(options =>....

UPDATE 2

Asp.net相关问答推荐

我可以强制刷新我的样式表文件吗?

RNGCryptoServiceProvider - 随机数审核

检测 ASP.NET 中的内存泄漏

web.config 部分的单独配置文件

Server.Transfer 在执行子请求时抛出错误.如何解决?

使用 C# 和 ASP.NET 从 Gmail/Hotmail/Yahoo 导入通讯簿

Window.Open 使用 PDF 流而不是 PDF 位置

加载特定 UpdatePanel 后如何调用客户端 javascript 函数

Web api 不支持 POST 方法

HttpContext.Current.Request.IsAuthenticated 和 HttpContext.Current.User.Identity.IsAuthenticated 有什么区别?

GridView 与嵌套类的属性绑定

DropDownList AppendDataBoundItems(第一项为空白且无重复项)

如何防止 XXE 攻击(.NET 中的 XmlDocument)

如何使用restsharp下载文件

HtmlAgilityPack Select 的子 node 不符合预期

哪个控件导致了回发?

使用 Web.Config 转换的高级任务

为在 ASP.NET Web API 中使用 User.Identity.Name 的方法编写单元测试

如何将 GridView.DataSource 导出到数据表或数据集?

~/ 等价于 javascript