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

如何在.NET Web API项目中实现OAuth 2.0与Open ID Connect

.NET Web API集成OAuth2/OIDC与Identity Server的优化方案

你的授权码流程走法是对的,但Web API用Cookie授权并非最优选择,下面具体分析并给出更合理的方案:

当前方案的问题

  • Cookie不适合API场景:API通常是无状态的,且面向多种客户端(SPA、移动端、Postman等),Cookie依赖浏览器会话机制,非浏览器客户端处理Cookie会很麻烦;分布式部署时还需额外配置会话共享(如Redis),增加复杂度。
  • 用ID Token做授权不严谨:ID Token的核心作用是身份认证,用来确认用户是谁,而非授权(确认用户能做什么)。Access Token才是Identity Server专门颁发给API做授权验证的凭证,包含了授权范围(scope)、用户权限等关键信息。

推荐方案:Web API直接验证Access Token(Bearer Token)

API只需要专注于验证Token的合法性和授权范围,授权码流程交给调用API的客户端来处理,这是更符合API设计原则的做法。

1. 配置API的认证与授权

在Program.cs中配置JWT验证,直接对接Identity Server:

var builder = WebApplication.CreateBuilder(args);

// 添加JWT认证,验证Identity Server颁发的Access Token
builder.Services.AddAuthentication("Bearer")
    .AddJwtBearer(options =>
    {
        options.Authority = "https://your-identity-server-address"; // 你的Identity Server地址
        options.Audience = "your-api-resource-name"; // API在Identity Server中注册的资源名称
        // 启用HTTPS时开启,确保Token传输安全
        options.RequireHttpsMetadata = true;
    });

// 配置授权策略
builder.Services.AddAuthorization(options =>
{
    options.AddPolicy("ApiAccess", policy =>
    {
        policy.RequireAuthenticatedUser();
        policy.RequireClaim("scope", "your-api-scope"); // 验证Token包含指定的权限范围
        // 如需角色验证,可添加:
        // policy.RequireRole("Admin", "Editor");
    });
});

builder.Services.AddControllers();

var app = builder.Build();

app.UseAuthentication();
app.UseAuthorization();

// 全局应用授权策略,也可在控制器/方法上用[Authorize(Policy = "ApiAccess")]
app.MapControllers().RequireAuthorization("ApiAccess");

app.Run();

2. 客户端处理授权码流程

授权码流程的逻辑应该放在调用API的客户端(比如前端SPA、MVC应用、移动端):

  • 客户端重定向到Identity Server,携带Client ID、Scope等参数请求授权;
  • 用户授权后,Identity Server返回授权码给客户端;
  • 客户端用授权码+Client Secret向Identity Server换取Access Token和ID Token;
  • 客户端调用API时,在请求头中携带Authorization: Bearer {access_token}。

特殊场景:API本身需提供登录页面

如果你的API同时包含UI(比如MVC项目兼具API功能),需要自己处理登录跳转,那你当前的Cookie授权做法是可行的,但要注意以下几点:

  • 强化Cookie安全:设置HttpOnly、Secure、SameSite=Strict属性,防范XSS和CSRF攻击;
  • 区分Token用途:用ID Token完成身份认证,将用户声明存入Cookie;若需调用其他API,仍需用Access Token作为Bearer凭证;
  • 授权策略优先基于权限声明:比如从Identity Server获取的角色、权限等声明,而非仅依赖ID Token的基础信息。

内容的提问来源于stack exchange,提问作者Lawzzz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 09:37:35