C# 如何验证来自不同颁发者的jwt令牌

C# 如何验证来自不同颁发者的jwt令牌,c#,azure,jwt,azure-logic-apps,adaptive-cards,C#,Azure,Jwt,Azure Logic Apps,Adaptive Cards,我正在使用可操作消息(与Outlook web app一起)调用逻辑应用程序。因此,我在请求中获得了一个不记名令牌: “行动授权”:“持有人eyJ0eXAi…” 调用堆栈: Outlook web app->Logic app->my endpoint托管在azure中 现在,我尝试使用jwt.io验证令牌,但遇到了签名无效的问题。 所以我尝试用JwtSecurityTokenHandler在c#中验证它 我试图添加https://substrate.office.com/sts/添加到颁发者列

我正在使用可操作消息(与Outlook web app一起)调用逻辑应用程序。因此,我在请求中获得了一个不记名令牌:

“行动授权”:“持有人eyJ0eXAi…”

调用堆栈:
Outlook web app->Logic app->my endpoint托管在azure中

现在,我尝试使用jwt.io验证令牌,但遇到了签名无效的问题。 所以我尝试用
JwtSecurityTokenHandler
在c#中验证它

我试图添加
https://substrate.office.com/sts/
添加到颁发者列表,但似乎验证甚至没有到达那里

我正在使用以下代码验证office.com发布的jwt令牌:

bool已授权(HttpActionContext-actionContext)
{
var valid=base.IsAuthorized(actionContext);
//当基类无效时,承载令牌的自定义句柄
如果(!valid&&actionContext.Request.Headers.Authorization.Scheme==“Bearer”)
{
var jwt=actionContext.Request.Headers.Authorization.Parameter;
var th=新的JwtSecurityTokenHandler();
var sjwt=th.ReadToken(jwt)作为JwtSecurityToken;
var validationParameters=新的TokenValidationParameters
{
ValidateSuersigningKey=false,
//IssuerSigningToken=sjwt,
ValidateActor=false,
ValidateAudience=false,
validateisuer=true,
ValidateLifetime=true,
ValidIssuers=new[]{”https://substrate.office.com/sts/" },
有效期=新[]{”https://XXX.logic.azure.com"}
};
SecurityToken validatedToken;
尝试
{
th.ValidateToken(jwt、validationParameters、out validatedToken);
}
捕获(例外情况除外)
{
返回false;
}
}
返回有效;
}
这是我的JWT令牌:

我得到一个例外:

IDX10500: Signature validation failed. Unable to resolve SecurityKeyIdentifier: 'SecurityKeyIdentifier
    (
    IsReadOnly = False,
    Count = 2,
    Clause[0] = X509ThumbprintKeyIdentifierClause(Hash = 0x818...),
    Clause[1] = System.IdentityModel.Tokens.NamedKeySecurityKeyIdentifierClause
    )
', ...
即使我设置了
ValidateIssuerSigningKey=false


有没有办法接受
https://substrate.office.com/sts/
作为有效的颁发者?

例外说明“签名验证失败”。 要解决此问题,我们不能只将想要的有效颁发者添加到
ValidIssuers
,我们需要验证令牌是否由颁发者本身颁发

特别是在office.com作为发行人的情况下,我在这里找到了期望的密钥(JWK-JSON Web密钥): (还)

以下是工作代码:

bool IsAuthorized(HttpActionContext actionContext)
        {
            var valid = base.IsAuthorized(actionContext);

            // Custom handle for Bearer token, when invalid from base-class
            if (!valid && actionContext.Request.Headers.Authorization.Scheme == "Bearer")
            {
                var jwt = actionContext.Request.Headers.Authorization.Parameter;
                var th = new JwtSecurityTokenHandler();

                var validationParameters = new TokenValidationParameters
                {
                    ValidateAudience = false,
                    ValidateLifetime = true,
                    ValidateIssuer = true,
                    ValidateIssuerSigningKey = true,
                    IssuerSigningKey = new JsonWebKey(GetJWK()),
                    ValidIssuers = new[] { "https://substrate.office.com/sts/" }
                };

                Microsoft.IdentityModel.Tokens.SecurityToken validatedToken;
                try
                {
                    var claims = th.ValidateToken(jwt, validationParameters, out validatedToken);
                    valid = true;
                }
                catch (Exception ex)
                {
                    valid = false;
                }
            }

            return valid;
        }

        // Get the token from configuration
        private string GetJWK()
        {
            return ConfigurationManager.AppSettings["ida:jwks_json"];
        }
在appsettings中,我将网站上的RSA密钥用于验证令牌,它看起来像:

{"kty":"RSA","use":"sig","kid":"gY...","x5t":"gY...","n":"2w...","e":"AQAB","x5c":["MII..."]}

你能给我们看看你的代币是什么样子的吗?发卡机构应为“iss”索赔中的值,因此
ValidateIssuerSigningKey
具有不同的用途。它在这里验证令牌是否由
right\want
授权服务器颁发。您不应该将此属性设置为False,因为我添加了令牌
validateisuersigningkey=false
仅用于测试目的,我认为这将缓解我遇到的异常。提示:您正在使用大量手动步骤,这些步骤可以通过使用Microsoft.IdentityModel.Token和使用Microsoft.IdentityModel.Protocols Nugets来防止。