要使Microsoft.AspNetCore.Authorization.AuthorizeAttribute
返回401而不是重定向到登录页面,你可以使用自定义的授权策略来替代默认的授权策略。以下是一个示例的解决方法:
- 创建一个自定义的授权策略类,继承自
IAuthorizationHandler
接口,并实现其HandleAsync
方法。在该方法中,你可以检查用户是否已通过身份验证,并根据需要设置授权结果。
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc.Filters;
public class CustomAuthorizationHandler : IAuthorizationHandler
{
public Task HandleAsync(AuthorizationHandlerContext context)
{
foreach (var requirement in context.Requirements)
{
var filterContext = (AuthorizationFilterContext)requirement.Resource;
if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
filterContext.HttpContext.Response.StatusCode = 401;
context.Succeed(requirement);
}
}
return Task.CompletedTask;
}
}
- 在
Startup.cs
文件中,注册自定义的授权策略类。
using Microsoft.AspNetCore.Authorization;
using Microsoft.Extensions.DependencyInjection;
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
// 注册自定义的授权策略
services.AddSingleton<IAuthorizationHandler, CustomAuthorizationHandler>();
// 添加默认的策略授权
services.AddAuthorization(options =>
{
options.DefaultPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
});
}
public void Configure(IApplicationBuilder app)
{
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers()
.RequireAuthorization(); // 应用授权策略
});
}
在上述示例中,我们创建了一个名为CustomAuthorizationHandler
的自定义授权策略类,并在其中检查用户是否已通过身份验证。如果用户未经身份验证,则将响应状态码设置为401,并通过context.Succeed(requirement)
方法设置授权结果为成功。
然后,在Startup.cs
文件的ConfigureServices
方法中,我们将自定义的授权策略类注册为IAuthorizationHandler
服务。然后,我们使用AddAuthorization
方法添加了一个默认的策略授权,要求用户必须经过身份验证。
最后,在Configure
方法中,我们使用RequireAuthorization
方法将授权策略应用于MapControllers
端点。这将使Microsoft.AspNetCore.Authorization.AuthorizeAttribute
使用我们自定义的授权策略。
这样,当用户未经身份验证时,Microsoft.AspNetCore.Authorization.AuthorizeAttribute
将返回401状态码,而不是重定向到登录页面。