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

首次实现Azure AD B2C遇Issuer配置解析失败问题求助

无法解析Azure AD B2C的Issuer URI配置(Spring Security OAuth2)

首次在Spring应用中集成Azure AD B2C OAuth2认证,配置参数后启动报错,提示无法解析提供的Issuer URI。浏览器直接访问该URI能正常返回OpenID配置JSON,但问题仍存在。

配置信息

application.properties

spring.application.name=Azure B2C SSO Sample

logging.level.org.springframework.security=trace
logging.level.org.springframework.web=trace

spring.security.oauth2.client.registration.azure.client-id=d9353b2a-a3c1-49c2-9252-77fxxxxxx
spring.security.oauth2.client.registration.azure.client-secret=Idv8Q~BL1GRyirEaO-AXDaSQgFxxxxxx

spring.security.oauth2.client.registration.azure.redirect-uri=http://localhost:8080/login/oauth2/code/azure
spring.security.oauth2.client.registration.azure.authorization-grant-type=authorization_code
spring.security.oauth2.client.registration.azure.client-authentication-method=post
spring.security.oauth2.client.provider.azure.issuer-uri=https://learningakash.b2clogin.com/learningakash.onmicrosoft.com/v2.0/.well-known/openid-configuration?p=B2C_1_signupsignin

SecurityConfig.java

package config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(authorize -> authorize
                .anyRequest().authenticated() // 保护所有请求
            )
            .oauth2Login(oauth2 -> oauth2 // 配置OAuth2登录
                .authorizationEndpoint(authorization -> 
                    authorization.baseUri("/oauth2/authorize")) // 自定义授权端点
                .redirectionEndpoint(redirection -> 
                    redirection.baseUri("/login/oauth2/code/*")) // 自定义重定向端点
            )
            .logout(logout -> 
                logout.logoutSuccessUrl("/").permitAll() // 登出后重定向到首页
            );

        return http.build(); // 返回构建好的HttpSecurity
    }
}

报错信息

Caused by: java.lang.IllegalArgumentException: Unable to resolve Configuration with the provided Issuer of "https://learningakash.b2clogin.com/learningakash.onmicrosoft.com/v2.0/.well-known/openid-configuration?p=B2C_1_signupsignin"
    at org.springframework.security.oauth2.client.registration.ClientRegistrations.getBuilder(ClientRegistrations.java:231) ~[spring-security-oauth2-client-6.3.3.jar:6.3.3]
    at org.springframework.security.oauth2.client.registration.ClientRegistrations.fromIssuerLocation(ClientRegistrations.java:152) ~[spring-security-oauth2-client-6.3.3.jar:6.3.3]
    at org.springframework.boot.autoconfigure.security.oauth2.client.OAuth2ClientPropertiesMapper.getBuilderFromIssuerIfPossible(OAuth2ClientPropertiesMapper.java:97) ~[spring-boot-autoconfigure-3.3.4.jar:3.3.4]
    at org.springframework.boot.autoconfigure.security.oauth2.client.OAuth2ClientPropertiesMapper.getClientRegistration(OAuth2ClientPropertiesMapper.java:71) ~[spring-boot-autoconfigure-3.3.4.jar:3.3.4]
    at org.springframework.boot.autoconfigure.security.oauth2.client.OAuth2ClientPropertiesMapper.lambda$asClientRegistrations$0(OAuth2ClientPropertiesMapper.java:65) ~[spring-boot-autoconfigure-3.3.4.jar:3.3.4]
    at java.base/java.util.HashMap.forEach(HashMap.java:1429) ~[na:na]
    at org.springframework.boot.autoconfigure.security.oauth2.client.OAuth2ClientPropertiesMapper.asClientRegistrations(OAuth2ClientPropertiesMapper.java:64) ~[spring-boot-autoconfigure-3.3.4.jar:3.3.4]
    at org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientRegistrationRepositoryConfiguration.clientRegistrationRepository(OAuth2ClientRegistrationRepositoryConfiguration.java:49) ~[spring-boot-autoconfigure-3.3.4.jar:3.3.4]
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na]
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:146) ~[spring-beans-6.1.13.jar:6.1.13]
    ... 73 common frames omitted

已完成的排查

  • 确认Client ID、客户端密钥与Azure门户配置一致
  • 确认重定向URI已在Azure门户中注册
  • 浏览器直接访问Issuer URI能获取到有效的OpenID配置JSON

排查建议

1. 拆分Issuer URI与策略参数

Azure AD B2C的OpenID配置返回的issuer字段是不带策略参数(p=B2C_1_signupsignin)的基础路径,而Spring Security自动发现时会验证配置的Issuer URI与返回的issuer是否完全匹配。尝试手动配置各个端点,将Issuer URI改为基础路径:

spring.security.oauth2.client.provider.azure.issuer-uri=https://learningakash.b2clogin.com/learningakash.onmicrosoft.com/v2.0/
spring.security.oauth2.client.provider.azure.authorization-uri=https://learningakash.b2clogin.com/learningakash.onmicrosoft.com/oauth2/v2.0/authorize?p=B2C_1_signupsignin
spring.security.oauth2.client.provider.azure.token-uri=https://learningakash.b2clogin.com/learningakash.onmicrosoft.com/oauth2/v2.0/token?p=B2C_1_signupsignin
spring.security.oauth2.client.provider.azure.jwk-set-uri=https://learningakash.b2clogin.com/learningakash.onmicrosoft.com/discovery/v2.0/keys?p=B2C_1_signupsignin
spring.security.oauth2.client.provider.azure.user-info-uri=https://learningakash.b2clogin.com/learningakash.onmicrosoft.com/openid/v2.0/userinfo?p=B2C_1_signupsignin

2. 检查Spring Security的Issuer验证逻辑

Spring Security OAuth2客户端在自动发现配置时,会严格校验配置的Issuer URI和OpenID配置返回的issuer字段是否一致。如果返回的issuer是https://learningakash.b2clogin.com/learningakash.onmicrosoft.com/v2.0/,而你配置的是带查询参数的URI,就会导致验证失败。

3. 临时禁用Issuer验证(仅限排查)

若要快速确认是否为Issuer匹配问题,可以临时关闭Issuer验证(生产环境不建议)。修改SecurityConfig,手动指定授权请求的Issuer属性:

@Bean
public OAuth2AuthorizationRequestResolver authorizationRequestResolver(ClientRegistrationRepository clientRegistrationRepository) {
    DefaultOAuth2AuthorizationRequestResolver resolver = new DefaultOAuth2AuthorizationRequestResolver(clientRegistrationRepository, "/oauth2/authorize");
    resolver.setAuthorizationRequestCustomizer(customizer -> customizer.attributes(attrs -> {
        attrs.put(OAuth2ParameterNames.ISS, "https://learningakash.b2clogin.com/learningakash.onmicrosoft.com/v2.0/");
    }));
    return resolver;
}

4. 验证应用服务器的网络访问能力

浏览器能访问不代表应用服务器能访问,检查服务器是否有代理、防火墙限制。可以在应用中添加测试代码,直接发起HTTP请求到Issuer URI,确认应用能正常获取响应。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 17:06:00