You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 09:25:18