Oauth 2.0 如何使用RSA SHA-256哈希对JWT进行签名

Oauth 2.0 如何使用RSA SHA-256哈希对JWT进行签名,oauth-2.0,jwt,postman,office365api,rsa-sha256,Oauth 2.0,Jwt,Postman,Office365api,Rsa Sha256,我正在尝试通过客户端凭据获取访问令牌以使用office365 api。我正在使用此指南: 我使用邮递员发送我的请求(见下文) 但是,当我发送请求“AADSTS70002:验证凭据时出错。AADSTS50012:客户端断言包含无效签名”时,postman给了我此错误 因此,我相当确定我没有正确地对JWT进行签名,JWT用于请求中的client_断言参数。提到这个堆栈溢出问题,我发现我需要使用RSA SHA-256散列对其进行签名。然而,我仍然无法让我的JWT与我在网上找到的任何资源一起使用如何做

我正在尝试通过客户端凭据获取访问令牌以使用office365 api。我正在使用此指南:

我使用邮递员发送我的请求(见下文)

但是,当我发送请求“AADSTS70002:验证凭据时出错。AADSTS50012:客户端断言包含无效签名”时,postman给了我此错误


因此,我相当确定我没有正确地对JWT进行签名,JWT用于请求中的client_断言参数。提到这个堆栈溢出问题,我发现我需要使用RSA SHA-256散列对其进行签名。然而,我仍然无法让我的JWT与我在网上找到的任何资源一起使用如何做到这一点,它仍然会返回相同的错误。是否有在线生成器可用于使用RSA SHA-256哈希对JWT进行签名?或者任何专门用C#唱这种歌的代码示例?提前感谢。

首先,您需要在Azure广告清单上设置证书,请参阅博客

关于如何签署代币,这里是C#样本供您参考

    var x509Certificate2 = new X509Certificate2(@"{FILE PATH}\office_365_app.pfx", "PASS_WORD");

    X509SigningCredentials signingCredentials = new X509SigningCredentials(x509Certificate2, SecurityAlgorithms.RsaSha256Signature, SecurityAlgorithms.Sha256Digest);

    JwtSecurityTokenHandler tokenHandler = new JwtSecurityTokenHandler();

    var originalIssuer = "{YOUR CLIENT ID}";

    var issuer = originalIssuer;

    DateTime utcNow = DateTime.UtcNow;

    DateTime expired = utcNow + TimeSpan.FromHours(1);

    var claims = new List<Claim> {
        new Claim("aud", "https://login.microsoftonline.com/{YOUR_TENENT_ID}/oauth2/token", ClaimValueTypes.String, issuer, originalIssuer),
        new Claim("exp", "1460534173", ClaimValueTypes.DateTime, issuer, originalIssuer), 
        new Claim("jti", "{SOME GUID YOU ASSIGN}", ClaimValueTypes.String, issuer, originalIssuer),
        new Claim("nbf", "1460533573", ClaimValueTypes.String, issuer, originalIssuer),
        new Claim("sub", "{YOUR CLIENT ID}", ClaimValueTypes.String, issuer, originalIssuer)
    };

    ClaimsIdentity subject = new ClaimsIdentity(claims: claims);

    JwtSecurityToken jwtToken = tokenHandler.CreateToken(
        issuer: issuer,
        signingCredentials: signingCredentials,
        subject: subject) as JwtSecurityToken;

    jwtToken.Header.Remove("typ");

    var token = tokenHandler.WriteToken(jwtToken);
var x509Certificate2=new x509Certificate2(@“{FILE PATH}\office_365_app.pfx”,“PASS_WORD”);
X509SigningCredentials signingCredentials=新的X509SigningCredentials(x509Certificate2,SecurityAlgorithms.rsasA256Signature,SecurityAlgorithms.Sha256Digest);
JwtSecurityTokenHandler tokenHandler=新的JwtSecurityTokenHandler();
var originalissauer=“{YOUR CLIENT ID}”;
var发行人=原始发行人;
DateTime utcNow=DateTime.utcNow;
DateTime expired=utcNow+TimeSpan.FromHours(1);
var索赔=新列表{
新索赔(“澳元”)https://login.microsoftonline.com/{YOUR_TENENT_ID}/oauth2/token“,ClaimValueTypes.String,issuer,originalIssuer),
新索赔(“exp”,“1460534173”,ClaimValueTypes.DateTime,发行人,原始索赔人),
新声明(“jti”,“{您分配的某些GUID}”,ClaimValueTypes.String,issuer,originalIssuer),
新索赔(“nbf”、“1460533573”、索赔价值类型。字符串、发行人、原始索赔人),
新声明(“sub”,“您的客户ID}”,ClaimValueTypes.String,issuer,originalIssuer)
};
索赔主体=新的索赔主体(索赔:索赔);
JwtSecurityToken jwtToken=tokenHandler.CreateToken(
发行人:发行人,
签名凭据:签名凭据,
主题:主题)作为JwtSecurityToken;
jwtToken.Header.Remove(“类型”);
var token=tokenHandler.WriteToken(jwtToken);
您还可以在GitHub上找到该项目


您还可以使用以下地址提供的JWTAPI对JWT令牌进行签名:

示例代码可能如下所示:

                   Map<String, Object> claims = new HashMap<>();
                   claims.put("user", "some user");
                   Calendar expires = Calendar.getInstance();
                   expires.roll(Calendar.HOUR, 1000);
                    Jwts.builder()
                        .setClaims(claims)
                        .setIssuedAt(new Date())
                        .setExpiration(expires.getTime())
                        .signWith(SignatureAlgorithm.RS256, key)
                        .compact();
Map claims=newhashmap();
索赔。出售(“用户”、“某些用户”);
Calendar expires=Calendar.getInstance();
过期。滚动(日历小时,1000);
Jwts.builder()
.setClaims(索赔)
.setIssuedAt(新日期())
.setExpiration(expires.getTime())
.signWith(SignatureAlgorithm.RS256,密钥)
.compact();
您还可以在上验证您的令牌