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

     2023-03-10     141

关键词:

【中文标题】如何从 ASP.NET Core 2.0 中的自定义中间件请求身份验证【英文标题】:How to request authentication from custom middleware in ASP.NET Core 2.0 【发布时间】:2018-10-21 18:41:09 【问题描述】:

我有两个自定义 ASP.NET Core 中间件:一个用于身份验证(注册自己的身份验证方案),另一个用于某些业务工作。

如何在另一个中间件中使用身份验证中间件?我可以在这样的 MVC 中轻松使用身份验证:

 services.AddMvc(config =>
 
     var policy = new AuthorizationPolicyBuilder()
                      .RequireAuthenticatedUser()
                      .Build();
     config.Filters.Add(new AuthorizeFilter(policy));
 );

我还可以提供我自己的AuthenticationSchemeProvider 以根据请求的 URL 使用不同的身份验证方案。但身份验证中间件仅适用于 MVC 控制器。我希望它在我的自定义中间件运行之前也运行。有可能吗?

【问题讨论】:

这是一个自己调用 authz 的例子。 github.com/aspnet/AuthSamples/blob/… 【参考方案1】:

在自定义中间件方法Invoke() 调用ChallengeAsync() 如果用户未通过身份验证:

public async Task Invoke(HttpContext httpContext, IServiceProvider serviceProvider)

    if (!httpContext.User.Identity.IsAuthenticated)
    
        await httpContext.ChallengeAsync();
    
    else  /* logic here */ 

必须添加 NuGet 包 Microsoft.AspNetCore.Authentication.Abstractions

以上代码将运行默认的身份验证服务来对用户进行身份验证。如果默认的是您的自定义身份验证中间件,那么它将被调用。

【讨论】:

等待 httpContext.ChallengeAsync();很有帮助。但是 httpContext.User.Identity.IsAuthenticated 总是假的 @FemilShajin 您可能需要添加对 context.Request.Path 的检查,具体取决于您使用的身份验证提供程序。有关示例,请参见 ***.com/questions/53088514/…。【参考方案2】:

这是基于Rython使用Windows身份验证的具体情况的回答,但也允许设计的控制器使用其他类型的身份验证:

/// <summary>
/// checks if current request resource can be accesses without being Windows-authenticated
/// </summary>
/// <param name="context">http context</param>
/// <returns>true if non-Windows is allowed. Otherwise, false</returns>
public static bool IsAllowedWithoutWindowsAuth(HttpContext context)

    bool isAllowedWithoutWindowsAuth = context.Request.Method == "OPTIONS" ||
                                       AllowedControllers.Any(c =>
                                       
                                           string path = context.Request.Path.ToString();
                                           return path.StartsWith(c, StringComparison.InvariantCulture);
                                       );
    return isAllowedWithoutWindowsAuth;


// custom middleware code 
public async Task Invoke(HttpContext context)

    // anonymous path, skipping
    if (IsAllowedWithoutWindowsAuth(context))
    
        await _next(context);
        return;
    

    if (!context.User.Identity.IsAuthenticated)
    
        await context.ChallengeAsync("Windows");
        return;
    

    // other code here
    await _next(context);
 

【讨论】:

从 ASP.NET Core 2.0 API 中的 JWT 令牌获取声明

...分使用cookie,而在API部分,我想使用JWT令牌。我的问题是如何从JWTt 查看详情

如何将 UserManager 注入 ASP.NET Core 2.0 中的另一个服务

】如何将UserManager注入ASP.NETCore2.0中的另一个服务【英文标题】:HowtoinjectUserManagertoanotherserviceinASP.NETCore2.0【发布时间】:2018-11-2002:43:30【问题描述】:我创建了一个使用用户管理员身份的服务publicclassUserManagerService:IUserManagerServi... 查看详情

ASP.NET CORE 2.0 中的 FromUri

】ASP.NETCORE2.0中的FromUri【英文标题】:FromUriinASP.NETCORE2.0【发布时间】:2018-06-2001:41:53【问题描述】:这个问题是因为在我使用ASP.NETCORE2.0的MVC项目中,我无法将[FromUri]attribute添加到我的驱动程序中。我尝试使用像System.Web.Http这... 查看详情

Asp.Net Core 2.0 中的“HttpPostedFileBase”

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

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 如何获取中间件中的所有请求标头? [复制]

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

ASP.NET Core 2.0 中的应用程序变量

...nASP.NETCore2.0【发布时间】:2018-07-1619:15:45【问题描述】:如何在ASP.NETCore2.0中设置和访问应用程序范围的变量?详情:我有一个变量,我们称它为CompanyName,它驻留在数据库中,几乎用于每个页面。我不想每次需要显示CompanyName时... 查看详情

ASP.NET Core 3.1 中的 Ocelot API Gateway 自定义聚合器问题

】ASP.NETCore3.1中的OcelotAPIGateway自定义聚合器问题【英文标题】:OcelotAPIGatewayCustomAggregatorIssueinASP.NETCore3.1【发布时间】:2021-01-2201:23:10【问题描述】:我在ASP.NET中使用Ocelot实现自定义聚合器,它在Startup.csOcelot中间件中引发错误... 查看详情

ASP.NET Core 2.0 中的多个身份

】ASP.NETCore2.0中的多个身份【英文标题】:MultipleIdentitiesinASP.NETCore2.0【发布时间】:2018-05-0602:34:40【问题描述】:我正在将ASP.NETCore1.0应用程序迁移到ASP.NETCore2.0。在我的启动中,我正在配置两个身份:services.AddIdentity<IdentityUse... 查看详情

ASP.net Core 2.0 Preview 配置中的 appsettings.json GetSection null

】ASP.netCore2.0Preview配置中的appsettings.jsonGetSectionnull【英文标题】:appsettings.jsoninASP.netCore2.0PreviewconfigurationGetSectionnull【发布时间】:2017-12-1506:29:21【问题描述】:我试图从Startup.cs中的注入配置中调用GetSection。值为null,而indexer... 查看详情

如何使用 asp.net core 2.0 Razor 页面执行下载操作

】如何使用asp.netcore2.0Razor页面执行下载操作【英文标题】:HowtoperformDownloadOperationusingasp.netcore2.0RazorPage【发布时间】:2019-06-2521:43:25【问题描述】:我正在开发文档管理系统,我已成功完成上传和删除文件,但我无法执行从数... 查看详情

没有身份的 ASP.NET Core 2.0 承载身份验证

...做的事情的列表:实现不记名令牌保护的webapi从同一项目中的端点发布令牌和刷新 查看详情

如何使用 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传递多个参数... 查看详情

如何从 ASP.NET Core 中的密码重置令牌中检索用户?

】如何从ASP.NETCore中的密码重置令牌中检索用户?【英文标题】:HowcanIretrieveauserfromapasswordresettokeninASP.NETCore?【发布时间】:2020-05-0417:22:46【问题描述】:我有一个ASP.NETCore2.1Web应用程序,并且正在添加忘记密码功能。我看过几... 查看详情

如何使用 ASP.NET Core 从 DbContext 中的 JWT 获取用户名?

】如何使用ASP.NETCore从DbContext中的JWT获取用户名?【英文标题】:HowtogetusernamefromJWTinDbContextusingASP.NETCore?【发布时间】:2018-11-2300:46:00【问题描述】:在MyDbContext中,我有方法LogChanges,它使用以下信息记录我的logs表中的任何更改... 查看详情

ASP.NET Core 2.0 Razor 页面使用 AddMvcCore() 而不是 AddMvc()

...AddMvc(),而是更喜欢使用AddMvcCore()。话虽如此,我想知道如何使用新的(从2.0开始)AddRazorPages 查看详情

如何使用目录名称中的句点从 Asp .Net Core 提供静态文件

】如何使用目录名称中的句点从Asp.NetCore提供静态文件【英文标题】:HowtoservestaticfilefromAsp.NetCorewithperiodindirectoryname【发布时间】:2020-04-0918:28:01【问题描述】:我目前正在尝试将ApplePay与网站相关联。为了验证域,ApplePay要求网... 查看详情

如何在 ASP.NET Core 2.0 中预编译视图?

】如何在ASP.NETCore2.0中预编译视图?【英文标题】:HowtoprecompileviewsinASP.NETCore2.0?【发布时间】:2018-09-0919:29:48【问题描述】:我根据article设置了我的解决方案。我省略了一些内容,因为根据this,ASP.NETCore2.0默认预编译视图。最... 查看详情