You need to enable JavaScript to run this app. 如何配置.NET Core应用对接Windows Server 2012 R2 ADFS 3.0实现OAuth2.0授权
优惠活动
大模型
产品
解决方案
定价
更多

如何配置.NET Core应用对接Windows Server 2012 R2 ADFS 3.0实现OAuth2.0授权

ADFS 2012 R2 配合.NET Core OAuth2.0/OpenIdConnect 配置实现指南

前提准备(ADFS 2012 R2 服务端配置)

  • 确保ADFS 2012 R2已安装且配置了合法服务证书,服务域名可以被你的.NET应用正常访问,ADFS默认要求应用回调地址为HTTPS协议
  • 打开ADFS管理控制台,定位到「应用程序组」,右键选择「添加应用程序组」
  • 选择「服务器应用程序」类型,填写你的.NET应用名称,进入下一步
  • 记录系统生成的客户端ID,添加应用回调地址https://<你的应用域名>/signin-oidc(OpenIdConnect中间件默认回调路径),进入下一步
  • 勾选「生成共享密钥」,记录生成的客户端密钥,完成应用组基础创建
  • 右键刚创建的应用程序组,选择「添加应用程序」,选择「Web API」类型,填写API名称后进入下一步
  • 标识符填写你的API资源标识(可使用应用域名或自定义URI,后续请求scope时会用到),点击添加后进入下一步
  • 访问控制策略选择匹配业务的规则(例如允许所有用户访问),进入下一步
  • 许可范围勾选openid、profile、email以及自定义授权范围,完成配置
  • 运行PowerShell命令开启ADFS 2012 R2的OAuth2.0支持:
    Set-AdfsProperties -EnableOAuth2 $true
    可执行Get-AdfsProperties | Select EnableOAuth2验证配置是否生效,返回True即为配置成功

.NET Core 应用端配置实现

你已引用的Microsoft.AspNetCore.Authentication.OpenIdConnect包可直接对接ADFS,如需解析JWT令牌可额外安装Microsoft.AspNetCore.Authentication.JwtBearer包。

配置文件示例(appsettings.json)

"AdfsSettings": {
  "Instance": "https://<你的ADFS域名>/adfs",
  "ClientId": "ADFS中记录的客户端ID",
  "ClientSecret": "ADFS中记录的客户端密钥",
  "CallbackPath": "/signin-oidc",
  "Resource": "ADFS中配置的Web API标识符",
  "MetadataAddress": "https://<你的ADFS域名>/adfs/.well-known/openid-configuration"
}

服务注册示例(.NET 6+ Program.cs)

using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authentication.OpenIdConnect;
using Microsoft.IdentityModel.Protocols.OpenIdConnect;
using Microsoft.IdentityModel.Tokens;
using System.Security.Claims;

var builder = WebApplication.CreateBuilder(args);
var adfsSettings = builder.Configuration.GetSection("AdfsSettings");

// 注册认证服务
builder.Services.AddAuthentication(options =>
{
    options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie()
.AddOpenIdConnect(options =>
{
    options.MetadataAddress = adfsSettings["MetadataAddress"];
    options.ClientId = adfsSettings["ClientId"];
    options.ClientSecret = adfsSettings["ClientSecret"];
    options.ResponseType = OpenIdConnectResponseType.Code; // 指定使用授权码流
    options.Resource = adfsSettings["Resource"];
    options.CallbackPath = adfsSettings["CallbackPath"];
    options.SaveTokens = true; // 自动将id_token、access_token保存到Cookie
    options.TokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuer = true,
        ValidIssuer = adfsSettings["Instance"],
        NameClaimType = ClaimTypes.Name, // 映射ADFS默认的姓名声明
        RoleClaimType = ClaimTypes.Role // 映射ADFS默认的角色声明
    };
    options.UsePkce = false; // ADFS 2012 R2不支持PKCE校验,必须关闭
    options.DisableTelemetry = true;
});

// 注册MVC等业务服务
builder.Services.AddControllersWithViews();

var app = builder.Build();

// 中间件顺序不可调整
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

令牌获取与使用说明

  • 配置完成后,用户访问需要授权的页面/接口时会自动跳转至ADFS登录页,登录完成后回调至应用
  • 你可以通过HttpContext.GetTokenAsync("access_token")获取ADFS返回的OAuth2.0访问令牌,通过HttpContext.GetTokenAsync("id_token")获取身份令牌
  • 拿到的access_token可直接透传给下游微服务,微服务仅需配置JwtBearer校验,将校验地址设置为ADFS的元数据地址即可完成授权校验
  • 如需配置单点登出,仅需在OpenIdConnect配置项中添加options.SignedOutCallbackPath = "/signout-callback-oidc";,同时在ADFS应用配置中添加对应登出回调地址即可

常见兼容问题处理

ADFS 2012 R2的OpenIdConnect实现与最新标准存在部分差异,遇到问题优先检查以下配置:

  • 必须关闭PKCE校验,2012 R2版本不支持该特性,开启会导致授权码流校验失败
  • 如出现令牌签名校验失败,确认应用可以正常访问ADFS的证书分发点,也可手动在TokenValidationParameters中配置IssuerSigningKey
  • 如需自定义声明映射,可通过options.ClaimActions.MapCustomJson方法调整ADFS返回的声明字段

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 14:15:02