在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相关问答推荐

JWT 和 Google 在 Razor 页面中进行身份验证和授权

我可以将图像添加到 ASP.NET 按钮吗?

使 ASP.NET WCF 将字典转换为 JSON,省略键和值标签

如何确定 web.config 中的编译 debug="true"

倒带请求正文流

Web Api 请求内容在操作过滤器中为空

为什么对 ASP.NET MVC 控制器的调用不执行 DelegatingHandler?

来自 IP 地址的经度和纬度值

ASP.Net:在共享/静态函数中使用 System.Web.UI.Control.ResolveUrl()

无法确定条件表达式的类型,因为 'string' 和 'System.DBNull' 之间没有隐式转换

如何使用自动生成的列隐藏 ASP.NET GridView 中的列?

ASP.net 与 PHP( Select 什么)

当用户使表单无效时单击取消按钮时,如何清除 MVC 客户端验证错误?

VirtualPath 在当前应用程序根目录之外

Windows 运行 ASP.NET 的 IIS 替代方案

在 Visual Studio 2010 Professional 中找不到请求的 .Net Framework 数据提供程序

如何删除asp.net中的特定会话?

ASP.NET 发布try 复制不存在的文件

重新生成designer.cs

Visual Studio 2013 ASP.NET 项目中 Antlr 包的用途是什么?