【问题标题】:Azure AD and Spring Security with Oauth 2带有 Oauth 2 的 Azure AD 和 Spring Security
【发布时间】:2018-05-10 16:21:19
【问题描述】:

我们正在尝试使用 Azure AD 和 Spring 安全性实施 SSO 方案。 我们找到了一些线索:

https://github.com/spring-guides/tut-spring-boot-oauth2

https://github.com/Pytry/azure-b2c-oauth2

但这些都不能说明完整的故事。 实际上我们无法通过访问令牌解析,Spring对JWT令牌应该是什么有不同的想法。

理想情况下,我们不想从头开始编写 SSO 过滤器,而是覆盖令牌服务来为初学者实现自定义过滤。

有人成功实现了吗? 任何帮助将不胜感激。

【问题讨论】:

  • 关于此的任何更新。

标签: java security spring-mvc oauth azure-active-directory


【解决方案1】:

更新:我找到了一个更简单的方法。只需在userAuthorizationUri 后面添加一个资源参数即可。

security:
  oauth2:
    client:
      ...
      userAuthorizationUri: https://login.microsoftonline.com/<<tenantId>>/oauth2/authorize?resource=https://graph.windows.net
      ...

https://stackoverflow.com/a/45828135/2231168


原答案

在我的办公室,我们发现了一篇外国博客文章,它引导我们最终实现http://statemachine.hatenablog.com/entry/2016/04/19/155920

作为一种解决方法,您必须添加两个类来捕获 OAuth2RestTemplate 和请求增强器。它适用于包含 spring 4.2.8 的 spring boot 1.3.8,我们无法使其适用于更高版本。

application.yml:

azure:
  resource: https://graph.windows.net
security:
  oauth2:
    client:
      clientId: <<your client id>>
      clientSecret: <<your client secret>>
      accessTokenUri: https://login.microsoftonline.com/<<tenantId>>/oauth2/token
      userAuthorizationUri: https://login.microsoftonline.com/<<tenantId>>/oauth2/authorize
      clientAuthenticationScheme: form
      scope: openid
    resource:
      userInfoUri: https://graph.windows.net/me?api-version=1.6

AzureRequestEnhancer:

@Component
public class AzureRequestEnhancer implements RequestEnhancer {
    @Value("${azure.resource:null}")
    private String aadResource;

    @Override
    public void enhance(AccessTokenRequest request, OAuth2ProtectedResourceDetails resource, MultiValueMap<String, String> form, HttpHeaders headers) {
        if (!StringUtils.isEmpty(resource)) {
            form.set("resource", aadResource);
        }
    }
}

AzureRequestEnhancerCustomizer:

@Component
public class AzureRequestEnhancerCustomizer {
    @Autowired
    private OAuth2RestTemplate userInfoRestTemplate;

    @Autowired
    private AzureRequestEnhancer azureRequestEnhancer;

    @PostConstruct
    public void testWiring() {
        AuthorizationCodeAccessTokenProvider authorizationCodeAccessTokenProvider = new AuthorizationCodeAccessTokenProvider();
        authorizationCodeAccessTokenProvider.setTokenRequestEnhancer(azureRequestEnhancer);
        userInfoRestTemplate.setAccessTokenProvider(authorizationCodeAccessTokenProvider);
    }
}

PostConstruct 注解用于需要在依赖注入完成后执行任何初始化的方法。

我希望这对您的实施有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-23
    • 2016-01-27
    • 2016-02-26
    • 2019-02-18
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 2017-11-21
    相关资源
    最近更新 更多