如何实现ASP.net Web应用与Drupal之间基于OpenID的SSO集成
基于OpenID协议实现ASP.NET Web应用与Drupal站点SSO的实现方案
默认方案以Drupal作为OpenID服务端(OP)、ASP.NET应用作为依赖方(RP)为例,可根据自身用户池归属调整两端角色
整体实现步骤
第一步:Drupal端(OP端)配置
- 安装启用Drupal对应的OpenID Provider模块,Drupal 9/10推荐使用
OpenID Connect / OAuth2 server模块,安装完成后进入后台配置页 - 新建OpenID Connect客户端,填写ASP.NET应用的回调地址,默认格式为
https://你的ASP.NET域名/signin-oidc(为ASP.NET OpenID中间件默认回调路径,可自定义调整) - 配置客户端授权类型,勾选
authorization_code模式,为服务端应用最安全的授权方式 - 记录生成的客户端ID(Client ID)、客户端密钥(Client Secret)、Drupal端OpenID发现地址(默认路径为
https://你的Drupal域名/.well-known/openid-configuration),用于后续ASP.NET端配置 - 配置可返回的用户声明字段,包含用户ID、邮箱、用户名等ASP.NET端需要获取的字段,放开对应读取权限
第二步:ASP.NET端(RP端)配置
- 安装对应NuGet包:.NET Framework环境使用
Microsoft.Owin.Security.OpenIdConnect,.NET Core/.NET 5+环境使用Microsoft.AspNetCore.Authentication.OpenIdConnect - 配置身份验证中间件,.NET 6+环境Program.cs参考配置如下:
builder.Services.AddAuthentication(options => { options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme; options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme; }) .AddCookie() .AddOpenIdConnect(options => { options.Authority = "https://你的Drupal域名"; options.ClientId = "Drupal端生成的客户端ID"; options.ClientSecret = "Drupal端生成的客户端密钥"; options.ResponseType = "code"; options.SaveTokens = true; // 配置需要获取的用户声明范围 options.Scope.Add("openid"); options.Scope.Add("email"); options.Scope.Add("profile"); // 声明映射,将Drupal返回字段对应到ASP.NET内置Claims options.MapInboundClaims = true; options.TokenValidationParameters.NameClaimType = "name"; options.TokenValidationParameters.RoleClaimType = "roles"; });
- 启用身份验证中间件,确保在路由注册之后、授权配置之前调用
app.UseAuthentication();app.UseAuthorization(); - 给需要登录验证的接口/页面添加
[Authorize]特性,用户访问未授权资源时会自动跳转至Drupal登录页
核心注意事项
- 两个站点必须全部启用HTTPS协议,OpenID协议强制要求HTTPS避免令牌泄露,本地开发可使用自签名证书,生产环境必须使用受信任的SSL证书
- 回调地址必须和Drupal端配置完全一致,包含协议、域名、端口、路径,大小写敏感环境需统一大小写
- 客户端密钥需妥善保管,禁止硬编码在代码中,生产环境需使用密钥管理服务、环境变量或配置中心存储,禁止提交至代码仓库
- 合理配置令牌过期时间,建议Access Token过期时间设为15-30分钟,Refresh Token可根据业务需求设置有效期,ASP.NET端需实现令牌自动刷新逻辑
- 双向同步登出逻辑:用户退出时需同时清理两个站点的会话,可在Drupal端配置登出回调地址,ASP.NET端收到登出请求后清空本地Cookie
- 做好返回字段校验,不要完全信任OP端返回的所有数据,敏感操作需二次校验用户身份
- 若使用传统ASP.NET Web Forms应用,需通过OWIN中间件集成OpenID,不可直接使用ASP.NET Core类库
- 提前处理跨域问题,Drupal端需放开ASP.NET域名的跨域请求权限,避免获取用户信息时报CORS错误
内容的提问来源于stack exchange,提问作者Naseer Ahmad
相关产品推荐
相关产品推荐

