c# - 如何验证来自不同发行者的 jwt token

标签 c# azure jwt azure-logic-apps adaptive-cards

我正在使用可操作消息(通过 Outlook Web 应用)来调用逻辑应用。因此,我在请求中获得了不记名 token :

“操作授权”:“承载者 eyJ0eXAi...”

调用堆栈: Outlook Web 应用程序 -> 逻辑应用程序 -> 我的端点托管在 azure

现在我尝试使用 jwt.io 验证 token ,但收到签名无效的问题。 因此,我尝试使用 JwtSecurityTokenHandler 在 C# 中验证它。

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

我使用以下代码来验证 Office.com 颁发的 jwt token :

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 sjwt = th.ReadToken(jwt) as JwtSecurityToken;                

                var validationParameters = new TokenValidationParameters
                {
                    ValidateIssuerSigningKey = false,
                    //IssuerSigningToken = sjwt,
                    ValidateActor = false,
                    ValidateAudience = false,
                    ValidateIssuer = true,
                    ValidateLifetime = true,
                    ValidIssuers = new[] { "https://substrate.office.com/sts/" },
                    ValidAudiences = new[] {"https://XXX.logic.azure.com"}
        };

                SecurityToken validatedToken;
                try
                {
                    th.ValidateToken(jwt, validationParameters, out validatedToken);
                }
                catch (Exception ex)
                {
                    return false;
                }
            }

            return valid;
        }

这是我的 JWT token :

JWT Token

我遇到异常:

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 ,我们需要验证 token 是否是由发行者本身发行的。

特别是对于这种情况,office.com 是发行者,我在这里找到了预期的 key (JWK - JSON Web Key): https://substrate.office.com/sts/common/discovery/keys (又https://substrate.office.com/sts/common/.well-known/openid-configuration)

这是工作代码:

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"];
        }

在应用程序设置中,我将来自网站的 RSA key 用于验证 token ,如下所示:

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

关于c# - 如何验证来自不同发行者的 jwt token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56017333/

相关文章:

openssl - 如何将 JWK 中的公钥转换为 OpenSSL 的 PEM?

c# - 为什么我收到此错误 : requires a return value or an exception to throw?

javascript - 使用按钮切换数据库中的位值 - 使用 Entity Framework

c# - 使用动态属性搜索 LINQ 中的 Where 子句

azure - 无法从 Debian 9 登录 Azure 帐户

azure - 使用 StackExchange.Redis 存储到 Azure 托管的 Redis 缓存时出现问题

visual-studio-2010 - Visual Studio 2012 PowerShell 项目

java - 创建名称为authenticationTokenFilterBean 的bean 时出错 : Unsatisfied dependency expressed through field tokenUtils

c# - 使用 Odata 服务并获取 JSON 格式的结果

mysql - 如何将 JWT token 发送到 Node.js 中的 header