在ASP.NET Identity中处理未认证/未授权API请求的方案咨询
解决ASP.NET Identity API未认证/未授权请求返回JSON而非重定向的问题
要实现API请求在未认证/未授权时返回JSON错误而非重定向,核心是拦截ASP.NET Identity默认的Cookie认证重定向逻辑,针对API请求做特殊处理。以下是具体配置步骤:
1. 配置Cookie认证事件拦截
在Startup.cs(.NET 5及更早)或Program.cs(.NET 6+)中,修改Identity的Cookie认证选项,重写OnRedirectToLogin和OnRedirectToAccessDenied事件:
services.AddAuthentication(options => { options.DefaultAuthenticateScheme = IdentityConstants.ApplicationScheme; options.DefaultChallengeScheme = IdentityConstants.ApplicationScheme; }) .AddCookie(IdentityConstants.ApplicationScheme, options => { // 处理未认证请求(默认会跳转到登录页) options.Events.OnRedirectToLogin = context => { if (IsApiRequest(context.Request)) { context.Response.StatusCode = StatusCodes.Status401Unauthorized; context.Response.ContentType = "application/json"; return context.Response.WriteAsync(System.Text.Json.JsonSerializer.Serialize(new { error = "Unauthorized", message = "需要登录才能访问该资源" })); } // 非API请求保持默认重定向行为 context.Response.Redirect(context.RedirectUri); return Task.CompletedTask; }; // 处理未授权请求(默认会跳转到禁止页) options.Events.OnRedirectToAccessDenied = context => { if (IsApiRequest(context.Request)) { context.Response.StatusCode = StatusCodes.Status403Forbidden; context.Response.ContentType = "application/json"; return context.Response.WriteAsync(System.Text.Json.JsonSerializer.Serialize(new { error = "Forbidden", message = "没有权限访问该资源" })); } context.Response.Redirect(context.RedirectUri); return Task.CompletedTask; }; });
2. 实现API请求判断逻辑
添加一个辅助方法,用于区分API请求和普通MVC请求(可根据实际项目规则调整):
private bool IsApiRequest(HttpRequest request) { // 规则1:请求路径以/api/开头 bool isApiPath = request.Path.StartsWithSegments("/api"); // 规则2:请求Accept头包含application/json bool acceptsJson = request.Headers.Accept.Contains("application/json"); return isApiPath || acceptsJson; }
3. (可选)针对端点配置授权响应
如果项目使用.NET 6+的端点路由,可进一步为API控制器端点明确指定响应类型:
app.UseEndpoints(endpoints => { endpoints.MapControllers() .RequireAuthorization() .WithMetadata(new Microsoft.AspNetCore.Mvc.Filters.ProducesResponseTypeAttribute(StatusCodes.Status401Unauthorized)) .WithMetadata(new Microsoft.AspNetCore.Mvc.Filters.ProducesResponseTypeAttribute(StatusCodes.Status403Forbidden)); });
关键说明
- 通过拦截Cookie认证的重定向事件,我们可以精准控制不同请求类型的响应行为:API请求返回JSON错误,普通页面请求保持原有重定向逻辑。
IsApiRequest方法的判断规则可根据项目实际情况调整,比如结合特定的请求头或路由前缀。
内容的提问来源于stack exchange,提问作者Suiram1
相关产品推荐
相关产品推荐

