当前位置: 首页 > 知识库问答 >
问题:

Spring Boot Azure Active Directory签名JWT被拒绝:需要另一个算法,或者找不到匹配的密钥

微生啸
2023-03-14

我正在尝试用web服务为我的spring boot运行azure active directory。问题是当我成功登录时,它会抛出一个错误:

我已经用添加了以下属性(tetant-id、client-id、client-secret、user-group.allowed-group-names)

azure.activedirectory.redirect-uri-template=http://localhost:8080/login/oauth2/code/

我的配置是:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
public class AADSecurityConfiguration extends WebSecurityConfigurerAdapter {

  @Override
  public void configure(WebSecurity web) {
    web.ignoring().antMatchers("/health");
  }

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
        .antMatchers("/oauth2/**", "/login/**")
        .permitAll()
        .anyRequest()
        .authenticated()
        .and()
        .oauth2Login();
  }
}

简单的控制器请求是:

 @GetMapping("/list")
  @PreAuthorize("hasRole('Admin') or hasRole('Users')")
  public String getListPage() {
    return "list";
  }

依赖关系的版本为:

<spring.security.version>5.6.0</spring.security.version>
<spring.boot.version>2.5.4</spring.boot.version>
<azure.version>3.10.0</azure.version>

  <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-oauth2-client</artifactId>
        <version>${spring.boot.version}</version>
    </dependency>

    <dependency>
        <groupId>com.azure.spring</groupId>
        <artifactId>azure-spring-boot-starter-active-directory</artifactId>
        <version>${azure.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-oauth2-jose</artifactId>
        <version>5.6.0</version>
    </dependency>

你能不能用这个问题启发我,这样我就可以绕过去吗?

更新:使用msal4j解决。

示例如下:

https://github.com/Azure-Samples/ms-identity-java-webapp/tree/master/msal-java-webapp-sample

共有1个答案

樊飞飙
2023-03-14

检查令牌并使用 https://jwt.io 来验证声明:

1) 确保您选择了正确的签名算法(RS256)。JWT的标头包含有关用于签名令牌的密钥和加密方法的信息:

例:

{
  "typ": "JWT",
  "alg": "RS256",
  "x5t": "iBjL1Rcqzhiy4fpxIxdZqohM2Yk",
  "kid": "iBjL1Rcqzhiy4fpxIxdZqohM2Yk"
}

2) 检查 kid 声明指示用于验证令牌的特定公钥。确保根据用于对令牌进行签名的密钥进行检查。

3) 验证 scp 声明以验证用户是否已向调用应用授予调用 API 的权限。

4) 与aud(受众)核对:这标识令牌的预期接收者-其受众。API必须验证此值,如果值不匹配,则拒绝令牌。在v2.0令牌中,这始终是API的客户端ID,而在v1.0令牌,它可以是请求中使用的客户端ID或资源URI,具体取决于客户端请求令牌的方式。

5) 角色和 wids 声明,以验证用户本身是否有权调用您的 API。例如,管理员可能有权写入您的 API,但无权写入普通用户。

有关详细信息,请参阅这些文档

  1. 尝试解码 Jwt 时出错:已签名的 JWT 被拒绝:需要另一种算法,或者找不到匹配的键
  2. 微软身份平台访问令牌 - 微软身份平台|微软文档
 类似资料:
  • 我在Rest服务上使用JWT的Spring启动和Spring安全。我使用了下面链接中的代码:https://www.javainuse.com/spring/boot-jwt-mysql它工作正常,但是当我们使用它的令牌进行身份验证时...我们面临以下错误: til.getSignatureException:JWT签名与本地计算的签名不匹配。JWT有效性不能被断言,也不应该被信任。在til.ja

  • 我有这个超级班: 我想确定我完全理解了解决方案。通过,我给类DAOBase指定了特定的名称“daoBaseBeanname”,应用程序可以用它来标识类DAOBase,这样就不会把它与扩展DAOBase的其他类混淆了。对吗? 谢谢你。

  • 我设置了以下信息: 创建了AWS S3存储桶并将一些映像上载到特定文件夹 创建了AWS CloudFront web发行版: 来源域名:从列表中选择的S3 bucket 限制存储桶访问:是 来源访问标识:选定的已有标识 授予桶的读取权限:是,更新桶策略 拒绝访问

  • 由于Zuul不支持与SC的brixton.m3打包的版本中的补丁(https://github.com/spring-cloud/spring-cloud-netflix/issues/412),我正在尝试将一个基于Spring Boot+Spring Cloud的项目升级到brixton.m4。我启用了Spring-boot-starter-actul和spring-cloud-starter-

  • 问题内容: 我像往常一样重新编译了我的课程,并突然收到以下错误消息。为什么?我该如何解决? 问题答案: 当从不同的JAR文件加载属于同一个程序包的类,并且这些JAR文件具有使用不同证书签名的签名时,就会发生这种情况-或更常见的是,至少有一个签​​名,而另一个或多个未签名(包括已加载的类)目录中,因为这些AFAIK无法签名)。 因此,请确保使用相同的证书对所有JAR(或至少包含相同包中的类的JAR)