Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 自定义身份验证中间件-如何检查请求是匿名的还是授权的?_C#_Asp.net Mvc_Asp.net Core - Fatal编程技术网

C# 自定义身份验证中间件-如何检查请求是匿名的还是授权的?

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]属性的请求是否进行了身份验证

我正在尝试编写自己的身份验证中间件代码

在好的旧HttpModules中,当请求“Authorize”页面时,我可以使用“OnAuthenticateRequest”

我的中间件代码如下所示:

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中仍然有效吗?