Microsoft Graph 访问令牌刷新

2024-01-13

我正在编写一个应用程序,该应用程序使用“OAuth 2.0 客户端凭据授予流程”来获取用于调用 Microsoft Graph API 的访问令牌。应用程序以自身身份进行身份验证,而不是代表登录用户进行身份验证。

我的代码基于此来自微软的例子 https://github.com/Azure-Samples/ms-identity-dotnetcore-b2c-account-management/blob/master/src/Program.cs.

这是我初始化 GraphServiceClient 的方式:

    // Read application settings from appsettings.json (tenant ID, app ID, client secret, etc.)
    AppSettings config = AppSettingsFile.ReadFromJsonFile();

    // Initialize the client credential auth provider
    var scopes = new[] { "https://graph.microsoft.com/.default" };
    var clientSecretCredential = new ClientSecretCredential(config.TenantId, config.AppId, config.ClientSecret);
    var graphClient = new GraphServiceClient(clientSecretCredential, scopes);

这就是我后来使用它的方式(例如):

var users = await graphClient.Users.Request().GetAsync();

我的应用程序是一个 API。它不是一个运行一次就完成的应用程序。它将持续运行很长一段时间。所以我担心访问令牌过期后会发生什么。如何确保当我需要使用 graphClient 时访问令牌不会过期?


根据上面的代码片段,我认为您正在使用图SDK https://learn.microsoft.com/en-us/graph/sdks/choose-authentication-providers?tabs=CS#client-credentials-provider并使用客户端凭证流作为身份验证。

所以我们不需要在这里生成访问令牌,而只需使用graphClient调用图形 api 并收集您需要的信息。并且由于这种模式,它不会出现token expired情况是每次你调用一个 api 时你都会new clientSecretCredential在它之前。

让我们回到refresh,azure ad提供刷新令牌,用于在访问令牌过期时刷新访问令牌,因为刷新令牌的过期时间比访问令牌长得多,当我们尝试获取刷新令牌时,我们需要追加offline_access到范围当生成访问权限时 https://learn.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-auth-code-flow#successful-response-2。但使用客户端凭据流意味着您的应用程序使用自己的凭据请求新令牌,因此无需使用刷新令牌来避免已登录的用户再次登录。使用凭证流不应返回刷新令牌 https://www.rfc-editor.org/rfc/rfc6749#section-4.4.3.

那么你可能会有一些你坚持使用的想法refresh the expired token过程,那么你只能先生成一个访问令牌并保存令牌及其过期时间 https://learn.microsoft.com/en-us/dotnet/api/azure.core.accesstoken?view=azure-dotnet#properties在某个地方,并使用访问令牌作为http请求标头并调用graph api。那么代码应该是这样的,但是我认为你不愿意使用这种代码,你也可以参考这个文件 https://learn.microsoft.com/en-us/azure/active-directory/develop/scenario-daemon-acquire-token?tabs=dotnet更多细节:

var scopes = new[] { "https://graph.microsoft.com/.default" };
var tenantId = "tenant_name.onmicrosoft.com";
var clientId = "your_azuread_clientid";
var clientSecret = "corresponding_client_secret";
var clientSecretCredential = new ClientSecretCredential(
    tenantId, clientId, clientSecret);
var tokenRequestContext = new TokenRequestContext(scopes);
var token = clientSecretCredential.GetTokenAsync(tokenRequestContext).Result.Token;

//using http sender with the token
httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token );
// Call the web API.
HttpResponseMessage response = await _httpClient.GetAsync(apiUri);
...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Microsoft Graph 访问令牌刷新 的相关文章

随机推荐

  • 使用变量作为索引来回显批处理文件数组?

    如果我有一个批处理文件 并且我正在设置带有变量索引的数组 echo off SET x 1 SET myVar x happy 我该如何回应才能获得 快乐 我试过了 ECHO myVar x ECHO myVar x ECHO myVar
  • Java 9 + maven + junit:测试代码是否需要自己的 module-info.java 以及将其放在哪里?

    假设我有一个使用 Maven 3 和 junit 的 Java 项目 有src main java and src test java分别包含主要源和测试源的目录 一切都是标准的 现在我想将项目迁移到Java 9 src main java
  • 为什么 python 切片语法不从负索引环绕到正索引?

    我注意到 鉴于l 1 2 3 that l 1 回报 3 正如预期的那样 但是l 1 0 回报 与我的预期非常不同 然后我尝试了 1 1 我期望返回 3 1 但它也会返回 切片语法不从负索引环绕到正索引 反之亦然 是否有充分的理由 看起来它
  • SonarQube/SonarLint/Visual Studio:对解决方案中的所有项目使用一个规则集

    我们目前正在评估 SonarQube SonarLint 在我们的 NET 应用程序中的使用情况 我们对迄今为止所看到的情况非常满意 顺便说一句 值得称赞的是 SonarQube 已经走到了这一步 几年前我在我的博士项目中使用了它 从那时起
  • 如何使用 OleDb 读取 Oracle 中的 CLOB 列?

    我在 Oracle 10g 数据库上创建了一个具有以下结构的表 create table myTable id number 32 0 primary key myData clob 我可以毫无问题地在表中插入行 但是当我尝试使用 OleD
  • 如何以及何时使用 PreventDefault()?

    由此tutorial http blog nmsdvid com when to use return false and when preventdefault 据说 preventDefault 做一件事 停止浏览器默认设置 行为 我在
  • SharedObject 支持哪些数据类型?

    我知道用 SharedObject 存储字符串和数字是一件简单的事情 而且我也熟悉这类事情 var sharedObject SharedObject SharedObject getLocal userData var obj Objec
  • http://localhost/undefined 404(未找到)

    我的问题描述不清楚 让我再尝试一次 注意 这是我的生产 登台和开发网站 不仅仅是评论者似乎认为的那样只是我的开发网站 常见的问题 注意 使用 Chrome 时会出现此问题 而使用 Firefox 时不会出现此问题 问题出现在网站首页 htt
  • 将变量传递到 Zend Form

    我有一个实例化的 zend 表单 form Form Example 现在我想将 ID 从我的控制器传递到我的表单 所以我这样做了 form Form Example array id gt id 在表单内我尝试通过以下方式调用它 this
  • Android 表格布局中的右对齐列

    我想绘制一个表格 其中最后一列应位于表格的最右侧 表格行如下所示 Admin 2 New Network 2 New 事情应该是这样的 Admin 2 New Network 2 New XML
  • “未绑定到有效相机”CameraX 错误

    我试图遵循谷歌的 CameraX入门 代码实验室 我尝试用Java而不是Kotlin来完成它 但是当我运行它并尝试拍照时 它给了我一个错误 说未绑定到有效的相机 我在代码中找不到错误所在 我检查了 logcat 它说表面可能存在问题 它可能
  • 检测实际的形式变化?

    是否有一种现成的方法 也许在一个框架中 来检测表单是否具有changed与其原始值相比 onchange 事件不会执行 因为无论实际更改如何 它都会触发 例如 我可以使用两个 onchange 事件勾选一个复选框 然后再次关闭 最后的手段是
  • 索引布尔列与日期时间列的查询性能

    如果索引设置为datetime键入列 而不是boolean输入列 并且查询是在该列上完成的 在我当前的设计中 我有两列 is active小整数 1 indexed deleted at约会时间 查询是SELECT FROM table W
  • 选择哪个 log4j 门面?

    本质上 我正在寻找与 log4j 具有相同行为 配置 日志记录级别的东西 但缺少一些功能 例如格式化日志记录 请参阅here https stackoverflow com questions 920458 and here https s
  • 如何在 Xcode 中使用 cocos2d?

    我下载了最新版本的 cocos2d 但我对如何在当前项目中使用它感到困惑 谁能告诉我如何在 xcode 中使用它 我正在设计一个二维迷宫 我必须进口一些东西吗 任何形式的帮助将不胜感激 是的 您需要将cocos2d文件拖到您的项目中 然后它
  • boost.org 的 Spirit 解析器生成器框架有哪些缺点?

    在几个问题中我看到了以下建议Spirit http www boost org doc libs 1 37 0 libs spirit classic index html解析器生成器框架来自boost org http www boost
  • ClassCastException:android.app.Application

    导致错误的类如下 package com extrasmart import android app Activity import android os Bundle import android view View import and
  • 真正可复制的 Docker 容器?

    有一种安全趋势叫做可重复的构建 https en wikipedia org wiki Reproducible builds 其目标是有一种方法来创建输出二进制文件的位精确副本 以便用户可以验证在互联网上找到的版本是否值得信赖 Docke
  • 如何测试 ColdFusion 结构中是否存在变量?

    我想测试一下
  • Microsoft Graph 访问令牌刷新

    我正在编写一个应用程序 该应用程序使用 OAuth 2 0 客户端凭据授予流程 来获取用于调用 Microsoft Graph API 的访问令牌 应用程序以自身身份进行身份验证 而不是代表登录用户进行身份验证 我的代码基于此来自微软的例子