【问题标题】:Configuring spring-boot-starter-oauth2-client to authenticate with Azure AD配置 spring-boot-starter-oauth2-client 以使用 Azure AD 进行身份验证
【发布时间】:2021-05-25 22:25:52
【问题描述】:

我想在 Spring Boot 2.4 中将 Azure AD 添加为 OAuth2 提供程序。我跟着Spring Boot's OAuth2 docs,想出了如下配置:

spring.security.oauth2.client.provider.azuread.issuer-uri=https://login.microsoftonline.com/<tenant uuid>/v2.0
spring.security.oauth2.client.registration.azuread.authorization-grant-type=authorization_code
spring.security.oauth2.client.registration.azuread.client-id=<client uuid>
spring.security.oauth2.client.registration.azuread.client-name=Azure AD
spring.security.oauth2.client.registration.azuread.client-secret=<client secret>
spring.security.oauth2.client.registration.azuread.provider=azuread
spring.security.oauth2.client.registration.azuread.scope=openid

为了完整起见,这是我的网络安全配置:

@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // @formatter:off
        http
            .authorizeRequests(a -> a
                .antMatchers("/", "/login", "/error", "/webjars/**").permitAll()
                .anyRequest().authenticated()
            )
            .oauth2Login();
        // @formatter:on
    }
}

https://login.microsoftonline.com 上输入凭据返回时,我收到以下错误:

[invalid_id_token] An error occurred while attempting to decode the Jwt: Signed JWT rejected: Another algorithm expected, or no matching key(s) found.

问题源于 Nimus-JOSE-JWT 的 DefaultJWTProcessor.java

查看 Firefox 网络检查器中的请求,Spring Boot 从 Issuer URI 中选择正确的 URL。我不知道出了什么问题,感谢任何指点。

【问题讨论】:

  • 你有什么进展吗?

标签: spring-boot spring-security oauth-2.0 azure-active-directory


【解决方案1】:

我遇到了类似的问题,如果我没记错的话,范围有问题。不知道这是否也是您的问题,但无论如何以下配置对我有用(注意我使用的是客户端凭据而不是身份验证代码):

spring:
  security:
    oauth2:
      client:
        provider:
          azure:
            token-uri: https://login.microsoftonline.com/${custom.azure.account.tenant-id}/oauth2/token
        registration:
          azure:
            client-id: ${custom.azure.service-principal.client-id}
            client-secret: ${custom.azure.service-principal.client-secret}
            authorization-grant-type: client_credentials
            scope:
              - https://graph.microsoft.com/.default

【讨论】:

    【解决方案2】:

    Azure AD 有一些非常不直观(在我看来)的默认行为 - 我认为这就是您所遇到的:

    您的问题原因(我认为)

    • 您使用的是标准 OpenID Connect 范围
    • 这会导致 Azure AD 发出用于 Graph API 的访问令牌
    • 此令牌未通过自定义 API 中基于标准的验证,因为它仅设计用于图形 API - 它可以通过 JWT 标头中的 nonce 字段识别

    你需要做什么

    • 公开 API 范围,例如“默认”
    • 在您的 Web 客户端中使用此范围的完整值,例如“api://cb398b43-96e8-48e6-8e8e-b168d5816c0e/default”,其中长标识符是 API 的标识符
    • 然后您将获得 Spring 可以验证的普通 OAuth 令牌 - JWT 标头中没有 nonce 字段

    更多信息

    【讨论】:

      【解决方案3】:

      根据您的描述,您似乎想在 Spring Boot 中使用 azure ad 作为 OAuth2 提供程序,我发现 doc 说“用于 Azure Active Directory (AD) 的 Spring Starter 现在与 Spring Security 集成5.0'。它还提供了 a sample 的 springboot 网络应用程序。我也试过了,它确实有效。

      我认为需要注意的是,教程中说在azure ad中设置的重定向url是'http://localhost:8080/login/oauth2/code/',但是当我测试时,它证明是'http ://localhost:8080/login/oauth2/code/azure'。

      如果您出错,我不确定,但也许您可以将“范围”的配置更改为“openid,profile,offline_access”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-10-25
        • 2018-11-17
        • 1970-01-01
        • 1970-01-01
        • 2020-02-01
        • 1970-01-01
        • 2016-07-17
        相关资源
        最近更新 更多