如何基于Azure门户为多技术栈应用实现AD用户SSO及用户ID映射
Azure AD 多技术栈应用单点登录(SSO)实施指南及问题解答
一、SSO 整体实施步骤
1. Azure AD 门户端通用配置
- 注册所有应用:
- 进入Azure AD门户,依次选择「企业应用」→「新建应用」,针对自定义开发应用选择「非库应用」,填写名称后完成创建。
- 每个应用注册完成后,记录应用程序(客户端)ID和目录(租户)ID,后续开发配置必须用到。
- 配置SSO认证方式:
- 进入目标应用的「单点登录」页面,推荐选择
OpenID Connect(适配现代应用场景),也可根据需求选SAML。 - 针对OpenID Connect:设置应用的重定向URI(登录成功后回调地址);针对SAML:配置实体ID、回复URL,并保存SAML签名证书用于应用端校验。
- 进入目标应用的「单点登录」页面,推荐选择
- 角色与用户分配(可选):
- 在Azure AD中创建匹配原系统的角色组,将用户添加至对应组;或直接在应用注册的「应用角色」中定义角色,分配给指定用户/组。
2. 各技术栈应用端配置
ASP.NET / ASP.NET MVC
- 安装依赖NuGet包:
Microsoft.Owin.Security.OpenIdConnect、Microsoft.Owin.Security.Cookies - 在
Startup.cs中配置认证中间件:public void Configuration(IAppBuilder app) { app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType); app.UseCookieAuthentication(new CookieAuthenticationOptions()); app.UseOpenIdConnectAuthentication( new OpenIdConnectAuthenticationOptions { ClientId = "你的应用客户端ID", Authority = "https://login.microsoftonline.com/你的租户ID/v2.0", RedirectUri = "你的应用回调地址", PostLogoutRedirectUri = "你的应用登出跳转地址", Scope = "openid profile email", ResponseType = "id_token" }); } - 在需要登录验证的控制器/Action上添加
[Authorize]特性。
AngularJS
- 使用
msal-angular库(替代旧版adal-angular):- 安装依赖:
npm install msal-angular - 初始化MSAL配置:
var app = angular.module('myApp', ['msalAngular']); app.config(['msalAuthenticationServiceProvider', function(msalProvider) { msalProvider.init({ clientID: "你的应用客户端ID", authority: "https://login.microsoftonline.com/你的租户ID/v2.0", redirectUri: window.location.origin, cacheLocation: 'localStorage' }, $httpProvider); }]);
- 安装依赖:
- 在需要触发登录的位置调用
msalAuthenticationService.login(),通过msalAuthenticationService.getAccount()获取当前用户信息。
Java(以Spring Boot为例)
- 使用
msal4j依赖:- 添加Maven依赖:
<dependency> <groupId>com.microsoft.azure</groupId> <artifactId>msal4j</artifactId> <version>1.13.3</version> </dependency>
- 添加Maven依赖:
- 配置Spring Security认证流程:
@Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Value("${azure.client-id}") private String clientId; @Value("${azure.tenant-id}") private String tenantId; @Value("${azure.redirect-uri}") private String redirectUri; @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .anyRequest().authenticated() .and() .oauth2Login() .userInfoEndpoint() .oidcUserService(oidcUserService()); } private OAuth2UserService<OidcUserRequest, OidcUser> oidcUserService() { final OidcUserService delegate = new OidcUserService(); return (userRequest) -> { OidcUser oidcUser = delegate.loadUser(userRequest); // 自定义用户信息处理逻辑 return oidcUser; }; } } - 在
application.properties中配置azure.client-id、azure.tenant-id、azure.redirect-uri等参数。
二、实施SSO后捕获原有登录ID的方案
原有系统基于登录ID映射业务数据,可通过以下两种方式关联Azure AD用户与原有ID:
- Azure AD自定义声明映射:
在Azure AD中为用户添加自定义扩展属性(如legacyUserId),存入原有登录ID;然后在应用的SSO配置中,将该属性设置为自定义声明,登录时随ID Token/SAML断言返回给应用。 - 数据库关联表:
创建一张关联表,将Azure AD用户的唯一标识(如objectId或email)与原有登录ID绑定。用户首次SSO登录时,可引导手动关联原有账号,或通过后台批量导入历史关联数据;后续登录时,通过Azure AD标识查询关联表获取原有ID。
三、应用中读取Azure AD用户信息的方法
ASP.NET / ASP.NET MVC
通过ClaimsPrincipal获取用户声明:
var user = User as ClaimsPrincipal; var azureAdUserId = user.FindFirst(ClaimTypes.NameIdentifier)?.Value; var email = user.FindFirst(ClaimTypes.Email)?.Value; // 读取自定义声明(如原有登录ID) var legacyUserId = user.FindFirst("legacyUserId")?.Value;
AngularJS
通过MSAL库获取ID Token中的声明:
// 获取当前用户账号信息 var account = msalAuthenticationService.getAccount(); var azureAdUserId = account.idTokenClaims.sub; var email = account.idTokenClaims.email; // 读取自定义声明 var legacyUserId = account.idTokenClaims.legacyUserId;
Java(Spring Boot)
通过OidcUser对象获取用户信息:
@GetMapping("/user/profile") public String getUserProfile(@AuthenticationPrincipal OidcUser oidcUser) { String azureAdUserId = oidcUser.getSubject(); String email = oidcUser.getEmail(); // 读取自定义声明 String legacyUserId = oidcUser.getClaim("legacyUserId"); return "用户邮箱:" + email + " | 原有登录ID:" + legacyUserId; }
内容的提问来源于stack exchange,提问作者Ritanjali
相关产品推荐
相关产品推荐

