如何在 ASP.NET Core 2.0 中根据路由配置服务身份验证

     2023-03-07     168

关键词:

【中文标题】如何在 ASP.NET Core 2.0 中根据路由配置服务身份验证【英文标题】:How to ConfigureServices Authentication based on routes in ASP.NET Core 2.0 【发布时间】:2018-03-09 22:06:40 【问题描述】:

在 ASP.NET Core 1.x 中,我可以在 Configure 中使用身份验证方法,但现在在 ASP.NET Core 2.0 中,我必须在 ConfigureServices 并且无法在 Configure 方法中进行配置。例如

public void ConfigureServices(IServiceCollection services)

    services.AddAuthentication()
            .AddCookie()
            .AddXX();

然后在

public void Configure(IApplicationBuilder app, IHostingEnvironment env)

    ....
    app.UseAuthentication();

在过去,我可以使用类似的东西

app.UseOpenIdConnectAuthentication();

我不能再这样配置了。

那么我现在如何在 ASP.NET Core 2.0 中使用这样的东西?

app.Map(new PathString("/MyPath"), i => i.UseMyAuthMethod());

【问题讨论】:

我在 github github.com/aspnet/Security/issues/1479#issuecomment-360928524找到了微软人的答案 【参考方案1】:

Microsoft docs 说明如果您想在 ASP.NET Core 2+ 中使用多种身份验证方案该怎么做:

下面的例子可以在每一个上动态选择方案 请求依据。也就是cookies和API认证如何混用:

public void ConfigureServices(IServiceCollection services)

    services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
        .AddCookie(options =>
        
            // For example, can foward any requests that start with /api 
            // to the api scheme.
            options.ForwardDefaultSelector = ctx => 
               ctx.Request.Path.StartsWithSegments("/api") ? "Api" : null;
        )
        .AddYourApiAuth("Api");

示例:

我必须实现一个混合身份验证解决方案,其中我需要对某些请求进行 Cookie 身份验证,对其他请求进行令牌身份验证。这是我的样子:

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(options =>
    
        // if URL path starts with "/api" then use Bearer authentication instead
        options.ForwardDefaultSelector = httpContext => httpContext.Request.Path.StartsWithSegments("/api") ? JwtBearerDefaults.AuthenticationScheme : null;
    )
    .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, o =>
        
            o.TokenValidationParameters.ValidateIssuerSigningKey = true;
            o.TokenValidationParameters.IssuerSigningKey = symmetricKey;
            o.TokenValidationParameters.ValidAudience = JwtSignInHandler.TokenAudience;
            o.TokenValidationParameters.ValidIssuer = JwtSignInHandler.TokenIssuer;
        );

JWT Bearer 身份验证实现为described in this answer。

提示:

对我来说最大的“陷阱”之一是:即使 Cookies 策略将 URL 以“/api”开头的请求转发到 Bearer 策略,经过 cookie 验证的用户仍然可以访问这些 URL如果您使用的是 [Authorize] 注释。如果您希望仅通过 Bearer 身份验证访问这些 URL,则必须在 API 控制器/操作上使用 [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] 注释。

【讨论】:

【参考方案2】:

在 2.0 中,执行每个路由身份验证的最佳选择是使用自定义 IAuthenticationSchemeProvider

public class CustomAuthenticationSchemeProvider : AuthenticationSchemeProvider

    private readonly IHttpContextAccessor httpContextAccessor;

    public CustomAuthenticationSchemeProvider(
        IHttpContextAccessor httpContextAccessor,
        IOptions<AuthenticationOptions> options)
        : base(options)
    
        this.httpContextAccessor = httpContextAccessor;
    

    private async Task<AuthenticationScheme> GetRequestSchemeAsync()
    
        var request = httpContextAccessor.HttpContext?.Request;
        if (request == null)
        
            throw new ArgumentNullException("The HTTP request cannot be retrieved.");
        

        // For API requests, use authentication tokens.
        if (request.Path.StartsWithSegments("/api"))
        
            return await GetSchemeAsync(OAuthValidationDefaults.AuthenticationScheme);
        

        // For the other requests, return null to let the base methods
        // decide what's the best scheme based on the default schemes
        // configured in the global authentication options.
        return null;
    

    public override async Task<AuthenticationScheme> GetDefaultAuthenticateSchemeAsync() =>
        await GetRequestSchemeAsync() ??
        await base.GetDefaultAuthenticateSchemeAsync();

    public override async Task<AuthenticationScheme> GetDefaultChallengeSchemeAsync() =>
        await GetRequestSchemeAsync() ??
        await base.GetDefaultChallengeSchemeAsync();

    public override async Task<AuthenticationScheme> GetDefaultForbidSchemeAsync() =>
        await GetRequestSchemeAsync() ??
        await base.GetDefaultForbidSchemeAsync();

    public override async Task<AuthenticationScheme> GetDefaultSignInSchemeAsync() =>
        await GetRequestSchemeAsync() ??
        await base.GetDefaultSignInSchemeAsync();

    public override async Task<AuthenticationScheme> GetDefaultSignOutSchemeAsync() =>
        await GetRequestSchemeAsync() ??
        await base.GetDefaultSignOutSchemeAsync();

不要忘记在 DI 容器中注册它(理想情况下,作为单例):

// IHttpContextAccessor is not registered by default
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddSingleton<IAuthenticationSchemeProvider, CustomAuthenticationSchemeProvider>();

【讨论】:

微软有没有关于这个功能的文档?看起来很方便;很惊讶我在文档网站上看不到任何东西。基于路径中唯一的客户名称,我们有不同的安全要求。能够根据他们的配置动态地将人们路由到正确的身份验证提供程序对于该用例非常有用。

如何在 ASP.NET Core 2.0 Razor 页面中填充下拉列表

】如何在ASP.NETCore2.0Razor页面中填充下拉列表【英文标题】:HowtopopulatedropdownlistInASP.NETCore2.0Razorpage【发布时间】:2018-02-0702:23:31【问题描述】:我想从我的数据库中填充下拉列表。剃须刀页面中模型绑定的方式是什么publicIActionRe... 查看详情

如何在 Asp.net core 2.0 中使用 log4net

】如何在Asp.netcore2.0中使用log4net【英文标题】:Howtouselog4netinAsp.netcore2.0【发布时间】:2018-02-2012:23:18【问题描述】:我在我的asp.netcore2.0应用程序中配置了log4net,如本文所述LINK程序.cspublicstaticvoidMain(string[]args)varlogRepository=LogMana... 查看详情

在控制器中更改 ASP.NET Core 2.0 标识连接字符串

...)我可以设置一般上下文的连接字符串,但我现在不知道如何更改连 查看详情

ASP.Net Core 2.0 如何获取中间件中的所有请求标头? [复制]

】ASP.NetCore2.0如何获取中间件中的所有请求标头?[复制]【英文标题】:ASP.NetCore2.0Howtogetallrequestheadersinmiddleware?[duplicate]【发布时间】:2018-08-2418:06:34【问题描述】:在ASP.NetCore2.0中,我尝试在自定义中间件中验证传入的请求标头... 查看详情

如何使用 Url.Action 在 asp.net core 2.0 razor 页面中传递多个操作

】如何使用Url.Action在asp.netcore2.0razor页面中传递多个操作【英文标题】:Howtopassmultipleactionsinasp.netcore2.0razorpageusingUrl.Action【发布时间】:2018-07-1514:45:23【问题描述】:我想使用@Url.Action通过ASP.NETCore2.0Razor页面中的URL传递多个参数... 查看详情

如何在 Visual Studio 2017 Web Proj ASP.NET Core 2.0 中禁用 Https

】如何在VisualStudio2017WebProjASP.NETCore2.0中禁用Https【英文标题】:HowToDisableHttpsinVisualStudio2017WebProjASP.NETCore2.0【发布时间】:2018-03-1210:24:16【问题描述】:我在VisualStudio2017中使用ASP.NETCore2.0创建了一个默认项目。我选择了带有MVC和... 查看详情

Asp.Net Core 2.0 中的“HttpPostedFileBase”

...用API(使用.NETCore2.0开发)的ReactJS应用程序。我的问题是如何在.NETCore2.0API中使用HttpPostedFileBase以获取文件内容并将其保存在数据库中。【 查看详情

ASP.NET Core 2.0/Razor Pages - 如何在请求之间将数据保存在 NonFactors MVC6 网格中?

】ASP.NETCore2.0/RazorPages-如何在请求之间将数据保存在NonFactorsMVC6网格中?【英文标题】:ASP.NETCore2.0/RazorPages-HowcanIpersistdatainaNonFactorsMVC6gridbetweenrequests?【发布时间】:2018-09-0204:57:43【问题描述】:我正在使用NonFactorsMVC6.Grid。我几... 查看详情

如何在 asp.net core 2.0 中允许具有不同发行者的多个 JWT

】如何在asp.netcore2.0中允许具有不同发行者的多个JWT【英文标题】:HowtoallowmultipleJWTwithdifferentissuersinasp.netcore2.0【发布时间】:2018-03-1304:50:48【问题描述】:有没有办法在单个asp.netcore2.0应用程序中处理来自多个颁发者的JWT?这... 查看详情

如何在 ASP.NET Core 2.0 中设置多个身份验证方案?

】如何在ASP.NETCore2.0中设置多个身份验证方案?【英文标题】:HowdoIsetupmultipleauthschemesinASP.NETCore2.0?【发布时间】:2018-01-2312:34:16【问题描述】:我正在尝试将我的身份验证内容迁移到Core2.0,但在使用我自己的身份验证方案时遇... 查看详情

如何从 ASP.NET Core 2.0 中的自定义中间件请求身份验证

】如何从ASP.NETCore2.0中的自定义中间件请求身份验证【英文标题】:HowtorequestauthenticationfromcustommiddlewareinASP.NETCore2.0【发布时间】:2018-10-2118:41:09【问题描述】:我有两个自定义ASP.NETCore中间件:一个用于身份验证(注册自己的身... 查看详情

如何在 asp.net core v 2.0 中从 javascript 调用 PageModel 方法

】如何在asp.netcorev2.0中从javascript调用PageModel方法【英文标题】:HowtocallPageModelMethodfromjavascriptinasp.netcorev2.0【发布时间】:2018-02-2810:42:07【问题描述】:我正在编写一个asp.net核心网站,显示在其他地方生成的图片。我正在其他地... 查看详情

如何在 Asp.Net Core 2.0“AddJwtBearer”中间件中设置多个受众?

】如何在Asp.NetCore2.0“AddJwtBearer”中间件中设置多个受众?【英文标题】:HowtosetmultipleaudiencesinAsp.NetCore2.0"AddJwtBearer"middleware?【发布时间】:2018-04-0923:20:04【问题描述】:我有一个针对AAD进行身份验证的Asp.NetCore2.0WebApi:s... 查看详情

ASP.Net Core 2.0 - 如何从中间件返回自定义 json 或 xml 响应?

】ASP.NetCore2.0-如何从中间件返回自定义json或xml响应?【英文标题】:ASP.NetCore2.0-Howtoreturncustomjsonorxmlresponsefrommiddleware?【发布时间】:2018-08-2414:09:25【问题描述】:在ASP.NetCore2.0中,我试图返回格式为json或xml的消息,并带有状态... 查看详情

如何在 ASP.NET Core 2.0 Web api 中添加来自 IdentityServer4 和 Auth0 的 Jwt 身份验证?

】如何在ASP.NETCore2.0Webapi中添加来自IdentityServer4和Auth0的Jwt身份验证?【英文标题】:HowdoIaddJwtauthenticationfromIdentityServer4andAuth0inanASP.NETCore2.0webapi?【发布时间】:2018-05-1605:24:51【问题描述】:我们需要使用来自IdentityServer4的JWT令... 查看详情

在 asp.net core 2.0 中使用 angular 5 上传文件。文件为空

】在asp.netcore2.0中使用angular5上传文件。文件为空【英文标题】:FileUploadusingangular5inasp.netcore2.0.Fileisnull【发布时间】:2018-07-2118:05:02【问题描述】:我正在尝试在asp.netcore2.0中使用angular5上传文件。这是我的服务器端代码。publiccl... 查看详情

ASP.NET Core 2.0 api 中 JWT 令牌中的自定义声明

...间】:2018-07-0119:31:01【问题描述】:在asp.netcorewebapi中,如何检索JWT令牌的自定义用户属性?我可以使用本教程https://fullstackmark.com/post/13/jwt-authentication-with-aspne 查看详情

在 ASP.NET Core 2.0 Web Api 中返回“原始”json

】在ASP.NETCore2.0WebApi中返回“原始”json【英文标题】:Return"raw"jsoninASP.NETCore2.0WebApi【发布时间】:2018-01-1908:12:55【问题描述】:AFAIK在ASP.NETCoreWebApi中返回数据的标准方法是使用IActionResult并提供例如OkObject结果。这适用于... 查看详情