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

如何验证Microsoft图形API jwtaccess_token并保护您的API?

田佐
2023-03-14

脚本:

我有一个angular5客户端应用程序,它使用hello.js使用用户的Office 365凭据对用户进行身份验证。

客户代码:

  hello.init({
      msft: {
        id: configuration.AppID,
        oauth: {
          version: 2,
          auth: 'https://login.microsoftonline.com/' + configuration.TenantID + '/oauth2/v2.0/authorize'
        },
        scope_delim: ' ',
        form: false
      },
    },
      { redirect_uri: configuration.redirecturl }
    );
  }


  login() {

    hello('msft').login({ scope: 'User.Read People.Read', display: 'popup' })
      .then((authData: any) => {  // console.log(authData);

        this.zone.run(() => {

          // get profile
}

成功的响应是(出于安全原因被操纵)

{  
   "msft":{  
      "access_token":"REMOVED TOKEN HERE",
      "token_type":"Bearer",
      "expires_in":3599,
      "scope":"basic,User.Read,People.Read",
      "state":"",
      "session_state":"3b82898a-2b3f-445363f-89ae-d9696gg64ad3",
      "client_id":"672330148-2bb43-3080-9eee-1f46311f789c",
      "network":"msft",
      "display":"popup",
      "redirect_uri":"http://localhost:5653/",
      "expires":15245366.218
   }
}

解码后的access_token具有以下几个密钥:

标题:

1. nonce(需要一些特殊处理,我找不到任何关于特殊处理的文档)

2.典型:JWT

有效负载:

“澳元”: “https://graph.microsoft.com”,

一旦收到access_token,我就在每次调用的授权头中将access_token发送给我的后端API。目标是验证令牌,并且只有在access_token得到验证和授权的情况下才发送成功的响应。如果不成功,响应是401未授权。

验证access_token的API代码。NET CORE 2,如下(https://auth 0 . com/blog/securing-ASP-dot-NET-CORE-2-applications-with-jwts/)

namespace JWT
{
  public class Startup
  {
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void ConfigureServices(IServiceCollection services)
    {
      services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(options =>
        {
          options.TokenValidationParameters = new TokenValidationParameters
          {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true,
            ValidIssuer = Configuration["Jwt:Issuer"],
            ValidAudience = Configuration["Jwt:Issuer"],
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"]))
          };
        });

      services.AddMvc();
    }
  }
}

// other methods
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseAuthentication();

    app.UseMvc();
}

appsettings.json我有:

{   "Jwt": {
    "Key": "verySecretKey", **(I got the key from https://login.microsoftonline.com/common/discovery/keys with the kid value in access_token header)**
    "Issuer": "https://sts.windows.net/49bcf059-afa8-4bf9-8470-fad0c9cce27d/",   } }

最后,我收到的错误是:“WWW-身份验证→持有者错误=”invalid_token“,error_description=”找不到签名密钥“”

自从过去几天以来,我一直被困在这里,任何帮助都是救世主。

要点:

> < li>

我尝试在jwt.io中验证access _ token(https://nicksnettravels . builttoroam . com/post/2017/01/24/verificating-Azure-Active-Directory-JWT-tokens . aspx ),但是我无法验证。

这里的澳元是 https://graph.microsoft.com,我不确定我是否需要以及为什么我需要将澳元更改为我的客户 ID。 我该怎么做?

代码中是否有问题,或者我需要调整请求标头令牌的方式。

如果你需要更多的信息,请告诉我。

共有2个答案

郭远
2023-03-14

是的,这需要一点时间来解决。对于其他研究这个的人,这是我的理解。

您不使用Microsoft Graph API来保护您的web api。相反:

> < li>

客户端继续使用Microsoft Identity Platform进行验证。

客户端使用生成的JWT访问令牌来调用Web API,就像OAuth 2.0流一样

web API使用JwtBearerAuthenticationScheme,将权限设置为Microsoft身份平台。请参见此示例并搜索JwtBearerAuthenticationScheme。

web API使用提供的访问令牌来获得“代表”用户令牌。

Web API 使用此“代表”令牌调用图形 API。此令牌的生存期与客户端获取的令牌不同,刷新必须单独处理。

这是这个例子的一个非常精炼的版本。声明:我还没有付诸实践。

金健
2023-03-14

我试图在jwt.io(https://nicksnettravels.builttoroam.com/post/2017/01/24/Verifying-Azure-Active-Directory-JWT-Tokens.aspx)验证access_token,但我不能。

据我所见,Microsoft G组分API访问令牌的签名与其他访问令牌不同。您不需要验证适用于另一个API的令牌,这是他们的工作。

这里的澳元是 https://graph.microsoft.com,我不确定我是否需要以及为什么我需要将澳元更改为我的客户 ID。 我该怎么做?

我不知道 HelloJS,但您应该能够在使用 response_type=id_token 令牌进行身份验证后获得 Id 令牌。然后,您需要将其附加到请求中。它应该将你的客户端 ID 作为受众。

代码中是否有问题,或者我需要调整请求标头令牌的方式。

我唯一注意到的是你做了很多不必要的配置。基本上,配置应该是:

.AddJwtBearer(o =>
{
    o.Audience = "your-client-id";
    o.Authority = "https://login.microsoftonline.com/your-tenant-id/v2.0";
})

处理程序将在启动时自动获取公共签名密钥。在您的应用程序中硬编码签名密钥并不是一个好主意,因为当AAD完成签名密钥翻转时,您的应用程序将中断。

 类似资料:
  • 我能够在没有用户的情况下使用Get access从Microsoft Graph访问资源。但是,这个方法不允许我访问需要委派权限的资源。 我还尝试使用代表用户获取访问权限方法,但它需要我的用户通过网页登录,这在我的方案中是不需要的。 是否可以生成一个使用寿命长(可能超过一年)的授权代码,并使用该代码请求访问令牌,然后使用该令牌获取需要授权权限的资源? 注意:我知道生成具有这么长生命周期的授权代码不

  • 问题内容: 前一段时间,在我的工作中,我需要保护某些类以防他人读取代码。为此,我创建了一个EncryptedClassLoader,它加载了以前加密的类,并且还可以加载普通(未加密)的类。以这种方式工作有点复杂,并且也要进行测试(编译,然后加密,然后解密)。 是否有任何免费的框架可以满足我的需求,并且易于处理?我的意思是,不仅混淆而且还加密文件,因此没有人可以读取或调试该部分代码。我可以轻松更改用

  • 我们有一个在Apache和nginx上运行的Angular 8应用程序。我们使用带有和的Basic Auth保护此应用程序。 不幸的是,由于对服务器的请求被基本身份验证阻止,应用程序无法加载,Angular无法加载这些文件: 此 路 不通http://root/polyfills-es2015.js因为这是一个跨来源请求,所以不要求提供凭据 已阻止http://root/runtime-es201

  • 我从这里的人那里得到了建议,并尝试了一下,我一直在尝试创建一个用户身份验证系统。我很难用雄辩的语言将我所知道的在PHP中工作的东西翻译成Laravel。 我在这里尝试做的是识别用户,他们的角色,如果用户有管理员的角色,他们可以访问路由 /admin 我知道我可以使用诸如委托之类的软件包,但这并不能真正帮助我学习。 我已经为用户和角色创建了模型。我还有一个名为role\u user的查找表,其中包含

  • 问题内容: 我正在使用vaadin进行Java项目。现在,我有一个用户注册表格,看起来像这样: 当然,该表单除了显示之外不做任何其他事情。我想做的是,如果不满足某些要求,请让Vaadin在字段旁边显示错误消息。要求本身并不那么重要(假设我希望电子邮件字段至少包含8个字符)。我想知道的是:有没有简单的内置方法可以做到这一点?我在这里:https : //vaadin.com/api/com/vaad

  • 问题内容: 我有一个在Firebase上编写的应用程序。安全规则和客户端代码还不足以使我的应用正常工作。我需要连接服务器来执行一些任务: 清理非规范化的数据,这对于使用onDisconnect处理程序进行清理具有挑战性 建立数据的其他索引,这超出了 查询的能力范围 问题答案: _更新日期(20160611):如果您在https://firebase.google.com上创建了项目,则从服务器访问