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

如何基于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>
      
  • 配置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 09:35:35