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")]