Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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# 如何在ASP NET Core 3.1的Authorize属性中设置HTTP状态码_C#_Asp.net Core - Fatal编程技术网

C# 如何在ASP NET Core 3.1的Authorize属性中设置HTTP状态码

C# 如何在ASP NET Core 3.1的Authorize属性中设置HTTP状态码,c#,asp.net-core,C#,Asp.net Core,我有一个ASP.NETCore3.1应用程序。我正在使用身份验证。用户在应用程序中可以拥有100多个权限。对于用户授权,我扩展了Authorize属性。见下面我的代码 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)] public class CustomAuthorizeAttribute : AuthorizeAttribute,

我有一个
ASP.NETCore3.1
应用程序。我正在使用身份验证。用户在应用程序中可以拥有100多个权限。对于用户授权,我扩展了
Authorize
属性。见下面我的代码

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class CustomAuthorizeAttribute : AuthorizeAttribute, IAsyncAuthorizationFilter
{
    public IList<EnumPermission> Permissions { get; set; }
    public CustomAuthorizeAttribute(params EnumPermission[] permissions)
    {
        Permissions = permissions;
    }
    private void SetResult(AuthorizationFilterContext context)
    {
        context.Result = context.HttpContext.Request.IsAjaxRequest()
                ? (IActionResult)new StatusCodeResult((int)HttpStatusCode.Forbidden)
                : (IActionResult)new ForbidResult();
    }

    public async Task OnAuthorizationAsync(AuthorizationFilterContext context)
    {
        var user = context.HttpContext.User;
        var accepted = this.Permissions.Any(x => user.HasPermission(x));
        if (!accepted)
        {
            SetResult(context);
        }            
        return;
    }
}
我想在两种控制器类型(MVC和API)上使用上述属性 当我使用下面的API路由示例中的属性时,我遇到了一个问题

[CustomAuthorize(EnumPermission.AddUsers, Roles = "SuperAdmin")]
验证授权工作正常,但客户端API响应为
HTML
(不包括页面Auth/AccessDenied的内容)。如果在执行我的代码之前授权失败,则会发生这种情况(似乎响应是默认设置的Authorize属性)
对于API请求,我如何返回
JSON
格式;对于
MVC
请求,我如何返回
HTML
;当用户已登录,但他/她没有足够的权限时,我如何将状态设置为403;否则,我如何将状态设置为401?我应该设置/覆盖什么?

在我看来,您的属性混淆了两件事
Authorize
属性是由授权中间件执行的元数据,其中过滤器接口是稍后在管道中执行的MVC类型。您可能需要的是一个带有自定义需求的自定义策略,它可以验证用户角色和权限,所以请检查
Authorize
属性是由授权中间件执行的元数据,其中过滤器接口是稍后在管道中执行的MVC类型。您可能需要的是一个带有自定义需求的自定义策略,它可以验证用户角色和权限,所以请查看。
[CustomAuthorize(EnumPermission.AddUsers, Roles = "SuperAdmin")]