使用JWT的Azure AD for React和Spring安全性

sbdsn5lh  于 2022-11-17  发布在  React
关注(0)|答案(1)|浏览(123)

我有一个我认为是典型的应用程序,React前端和Sping Boot 作为后端。我正在尝试设置安全性,以使用Azure Active Directory对用户进行身份验证和授权。身份验证工作,但授权不工作
UI部分很简单,我使用MSAL进行身份验证并获得帐户。我可以在控制台日志中看到,从该Angular 来看一切正常。我还在令牌请求/响应中看到以下内容:https://login.microsoftonline.com/{XX}/oauth2/v2.0/token

scope: "User.Read profile openid email"
token_type: "Bearer"

我遇到的问题是在后端,我得到以下错误:

Failed to authorize filter invocation [GET /api/document/list] with attributes [hasAuthority('SCOPE_User.Read')] using AffirmativeBased [DecisionVoters=[org.springframework.security.web.access.expression.WebExpressionVoter@470b5213], AllowIfAllAbstainDecisions=false]
Sending JwtAuthenticationToken [Principal=org.springframework.security.oauth2.jwt.Jwt@43ebd8ff, Credentials=[PROTECTED], Authenticated=true, Details=WebAuthenticationDetails [RemoteIpAddress=0:0:0:0:0:0:0:1, SessionId=null], Granted Authorities=[]] to access denied handler since access is denied

正如您可以看到的,由于某些原因,在客户端我们没有获得用户有权访问的作用域(即User.Read)
Spring安全设置:

@Configuration
public class SecurityConfig {
    @Bean
    SecurityFilterChain web(HttpSecurity http) throws Exception {
        http.authorizeRequests((authorize) -> authorize
                        .mvcMatchers("/**").hasAuthority("SCOPE_User.Read")      // .permitAll()
                        .anyRequest().authenticated())
                .oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt);
        return http.build();
    }
}

在application.properties:

spring.security.oauth2.resourceserver.jwt.issuer-uri=https://login.microsoftonline.com/{XX}/v2.0
h79rfbju

h79rfbju1#

非常敏感的是,“后端”是一个资源服务器,而不是客户端(在您的情况下,客户端是React应用程序)。
我对Azure AD没有足够的经验来进行分类,但我怀疑微软没有遵循常见的OpenID实践(.well-known/openid-configuration可从颁发者URI访问并公开JWKS_URI),这导致Spring无法正确解析授权公钥。
您是否尝试过设置spring.security.oauth2.resourceserver.jwt.jwk-set-uri来代替或补充spring.security.oauth2.resourceserver.jwt.issuer-uriissuer-uri必须设置为iss claim access-token中的确切值,即使尾部斜杠也很重要)?

相关问题