如何验证来自不同发行者的 jwt 令牌

2024-03-29

我正在使用可操作的消息(通过 Outlook Web 应用程序)来调用逻辑应用程序。因此我在请求中得到了一个不记名令牌:

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

调用堆栈:Outlook web app -> Logic App -> my endpoint hosted in azure

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

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

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

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 令牌:

我收到异常:

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 Key):https://substrate.office.com/sts/common/discovery/keys https://substrate.office.com/sts/common/discovery/keys (also https://substrate.office.com/sts/common/.well-known/openid-configuration 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 密钥用于验证令牌,它看起来像:

{"kty":"RSA","use":"sig","kid":"gY...","x5t":"gY...","n":"2w...","e":"AQAB","x5c":["MII..."]}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何验证来自不同发行者的 jwt 令牌 的相关文章

随机推荐

  • 是否可以使用字典理解来反转Python中的字典

    我想反转字典key value使用字典理解进行配对 但如果新字典的键有多个值 则它将被最后一个值替换 如果重复某个键 是否可以使用理解附加到新字典中的值 Input test di a 1 b 2 c 3 d 2 Code v k for
  • Google Chrome 开发者工具未在 css 旁边显示 css 文件名

    It s a bug of google chrome or there are some guidelines which i should stick to to return that feature 谢谢 UPDATED问题是由 p
  • 如何在 Visual Studio 2008 中保持文档选项卡按上次使用情况排序

    注册表更改是什么 告诉 Visual Studio 始终将当前文档放置在窗口的左侧 默认实现是这样的 如果您打开了 10 个文档 并且您正在编辑第 5 个文档 那么它的选项卡将是该组中的第 5 个选项卡 随着注册表的更改 当您单击第五个文档
  • numpy.array 的总和部分

    假设我有以下数组 a np array 1 2 3 4 5 6 7 8 9 10 11 12 3 5 6 7 8 9 我想对第一行的前两个值求和 1 2 3 然后是接下来的两个值 3 4 7 进而5 6 11 对每一行依此类推 我想要的输出
  • HTML5 章节与文章

    我有一个由各种 部分 组成的页面 例如视频 新闻源等 我有点困惑如何用 HTML5 表示这些 目前我将它们作为 HTML5 section s 但经过进一步检查 看起来更正确的标签是 section
  • 如何从列表创建分组条形图

    我正在尝试绘制一个条形图 它比较两种不同情况下的多个项目的数量 所需的输出将是一个条形图 其中 4 4 8 个条形图彼此相邻 指示每种情况的每种类型的数量 这是我编写的初始代码 它没有给出我的期望 我该如何修改这个 import numpy
  • 如何在 Spring Data Elasticsearch 2.2.3.RELEASE 中配置 Rest 高级客户端的套接字超时

    我将 Spring Boot Starter Data Elasticsearch 2 2 3 RELEASE 与 Elasticsearch v6 8 6 结合使用 我配置了 RestHighLevelClient 以连接到集群 现在我在
  • 如何在 React 中将 JSON 响应呈现为下拉列表

    我目前正在尝试获取从 API 收到的一些 JSON 数据 并将其放入一个非常简单的 React 应用程序的下拉列表中 到目前为止 这是我的 DropDown 组件 import React from react var values fet
  • 如何使用boost预处理器生成访问器?

    例如 class A int m x float m y double m z int x const return m x float y const return m y double z const return m z 变得像 cl
  • 将忽略的配置文件添加到 git repo 作为示例

    我有一个正在开发的应用程序的存储库 其中包含配置文件 目前 我分发的是 dist扩展名 并让用户在编辑文件之前重命名该文件 nate myAwesomeApp git ls files gitignore README config dis
  • Nginx 没有将 websocket 升级响应传递回客户端?

    我在精确的 64 vagrant box 上使用 Nginx Websockets 并使用 c mono 作为应用程序服务器 目标是直接通过 Nginx 提供静态内容 并在同一端口上处理普通的 http 服务请求 在 service 上 和
  • YAML Azure Devops:步骤任务引用无效。任务名称不明确

    我正在尝试使用 AzureRmWebAppDeployment 任务将 WebJobs 部署到应用程序服务 Azure 应用程序服务部署 以下是以下 YAML 代码 任务 AzureRmWebAppDeployment 4 task Azu
  • 如何请求增加 Google Cloud 中的 GPU 配额

    我一直在尝试请求增加 Compute Engine 的 GPU 配额 因为当我尝试启动实例时 Google Cloud 说我的 GPU 配额为 0 我升级了帐户 但我似乎不知道需要做什么来增加配额 我看过很多教程 但自从这些教程发布以来 云
  • 将 BSTR 转换为 LPCWSTR

    这是我的需要 BSTR l strArgs LPCWSTR sth OutputDebugStringW sth 如何将 BSTR 转换为 LPCWSTR 是否有任何仅标头的库可以将任何字符串类型 微软 转换为 LPCWSTR 类型 只需覆
  • 使用java 8流的if-else条件[重复]

    这个问题在这里已经有答案了 设想 有一种情况我需要设置一些值List使用 Java 8 流 API 基于某些字段条件的对象 下面是对象的示例User public class User private int id private Stri
  • 在Python中将*args传递给string.format?

    是否可以将 args 传递给 string format 我有以下功能 classmethod def info cls component msg args Log an info message cls log cls Level IN
  • Java:定义错误的finalize方法会导致内存泄漏

    在java中 如果没有强引用指向x并且x符合垃圾收集条件 则垃圾收集将调用对象x的finalize方法 如果finalize方法永远不会终止 会导致内存泄漏吗 public class X protected void finalize w
  • Reactjs:如何自定义多个电子邮件添加和编辑的字段

    在我的项目中 有一个表单字段可以添加多封电子邮件 为此 我正在使用 react multi email 包 通过使用此包可以添加和删除电子邮件标签 但现在我也想要编辑操作 我是 ReactJS 的初学者 所以我不知道如何自定义或添加任何额外
  • Win32 - 作为普通用户进程启动最高可用子进程

    假设您的 Windows 用户帐户位于 Admin 组中 启用了 UAC 并且您正在以普通用户权限运行某些程序 A A从不要求提升 也从未得到提升 现在假设 A 想要启动程序 B 该程序的清单中具有 HighestAvailable 如果
  • 如何验证来自不同发行者的 jwt 令牌

    我正在使用可操作的消息 通过 Outlook Web 应用程序 来调用逻辑应用程序 因此我在请求中得到了一个不记名令牌 操作 授权 承载者eyJ0eXAi 调用堆栈 Outlook web app gt Logic App gt my en