C# 自定义身份验证中间件-如何检查请求是匿名的还是授权的?
我正在尝试编写自己的身份验证中间件代码 在好的旧HttpModules中,当请求“Authorize”页面时,我可以使用“OnAuthenticateRequest” 我的中间件代码如下所示:C# 自定义身份验证中间件-如何检查请求是匿名的还是授权的?,c#,asp.net-mvc,asp.net-core,C#,Asp.net Mvc,Asp.net Core,我正在尝试编写自己的身份验证中间件代码 在好的旧HttpModules中,当请求“Authorize”页面时,我可以使用“OnAuthenticateRequest” 我的中间件代码如下所示: public async Task Invoke(HttpContext context) { if (!context.User.Identity.IsAuthenticated) { } } 。。。但这也将检查对具有[AllowAnonymous]属性的请求是否进行了身份验证
public async Task Invoke(HttpContext context)
{
if (!context.User.Identity.IsAuthenticated)
{
}
}
。。。但这也将检查对具有[AllowAnonymous]属性的请求是否进行了身份验证
如何从中间件检查请求是否具有属性[AllowAnonymous]或[Authorize]
我需要能够做一些像
public async Task Invoke(HttpContext context)
{
if (HasAuthorizeAttribute && !context.User.Identity.IsAuthenticated)
{
}
await _next.Invoke(context);
}
谢谢。如果我理解你的意思是正确的,你正在寻找这样的东西:你想在控制器中对一些操作进行分类,一些操作可以在授权后执行,否则 在这种情况下,您可以在该操作的顶部设置
[Authorize]
和[AllowAnonymous]
:
公共类HomeController:控制器
{
[异名]
公共异步任务调用(HttpContext上下文)
{
//此处的所有代码都可以在未经授权的请求下执行。
//代码在这里。。。
}
[授权]
公共异步任务调用_2(HttpContext上下文)
{
//当请求被授权时,可以执行此处的所有代码
//代码在这里。。。
}
}
而且,如果您想授权所有将命中控制器的请求,可以在控制器名称顶部设置[authorize]
属性:
[授权]
公共类HomeController:控制器
{
//当您允许匿名请求时,仍然需要此属性
[异名]
公共异步任务调用(HttpContext上下文)
{
//此处的所有代码都可以在未经授权的请求下执行。
//代码在这里。。。
}
//您可以从此操作中删除[Authorize]属性,因为
//它是默认授权的
公共异步任务调用_2(HttpContext上下文)
{
//当请求被授权时,可以执行此处的所有代码
//代码在这里。。。
}
}
注意:因为您使用的是
任务
,所以最好将您的操作命名为异步
,例如:调用同步
或调用同步如果请求的目标是标记为[匿名]的页面,那么可以从中间件内部进行检查
//inside your middleware
var endpoint = context.GetEndpoint();
if (endpoint?.Metadata?.GetMetadata<IAllowAnonymous>() is object)
{
await _next(context);
return;
}
//在中间件内部
var endpoint=context.GetEndpoint();
if(endpoint?.Metadata?.GetMetadata()是对象)
{
等待下一步(上下文);
返回;
}
在这个博客上找到的原始解决方案:我认为这并没有回答关于ASP.NET MVC中间件和检测请求是否针对具有AllowOnymous属性的端点的问题。当将此与[AllowOnymous]
属性相结合时,端点?.Metadata?.GetMetadata()
仍然始终为空。这在.NETCore5.x中仍然有效吗?