如何配置.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
相关产品推荐
相关产品推荐

