此 ASP.NET Core 最小 Web API 使用 Microsoft 标准平台来保护端点(需要授权访问),并还代理用户访问 Microsoft Graph。 API 使用 ASP.NET Core Identity 与 Microsoft身份验证库( MSAL)交互来保护其端点。
(相关资料图)
控制台$ curl https://localhost:5001/api/me -H "Authorization: Bearer {valid-access-token}"{ "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users/$entity", "businessPhones": [], "displayName": "Maui", "givenName": null, "jobTitle": "dev", "mail": null, "mobilePhone": null, "officeLocation": null, "preferredLanguage": null, "surname": null, "id": "cff40dac-17ea-4183-9caf-65f2ee90c562"}
此示例应用程序支持 docs.microsoft.com 上的一篇或多篇技术文章。
首先,完成配置应用程序以公开Web API中的步骤以注册示例API并公开范例。
使用以下设置进行应用注册:
应用程序注册表设置 | 此示例应用程序的价值 | 笔记 |
---|---|---|
姓名 | active-directory-protected-api-access-protected-api | 此示例的建议值。您可以随时更改应用名称。 |
支持的账户类型 | 只有这组目录中的帐户(单租户) | 此示例需要。支持单租户。 |
标识符 URI | api://{clientId} | 此示例的建议值。您必须使用 Azure 门户中显示的值更改客户端 ID。 |
公开API | 范围名称:谁可以user_impersonation 相同?户同意说明:状态:已启用_Act on behalf of the user Allows the API to act on behalf of the user. Act on your behalf Allows the API to act on your behalf. | 添加一个新的作用域,内容如下api://{clientId}/user_impersonation 。这个例子的必要价值。 |
API权限 | https://graph.microsoft.com/User.Read | 添加新的委派权力Microsoft Graph User.Read 。这个例子的必要价值。 |
客机密码 | Azure 门户中显示的价值 | ⚠️马上记下这个值!它只显示一次(当您创建它时)。 |
ℹ️表中的粗体文本与Azure门户中的UI元素匹配(或类似),同时
code formatting
显示您在文本中输入的价值或在Azure门户中选择的价值。
其次,完成向微软标准注册应用程序中的步骤以注册客户终端显示示例应用。
使用以下设置进行应用注册:
应用程序注册表设置 | 此示例应用程序的价值 | 笔记 |
---|---|---|
姓名 | active-directory-curl-app | 此示例的建议值。您可以随时更改应用名称。 |
支持的账户类型 | 只有这组目录中的帐户(单租户) | 此示例需要。支持单租户。 |
平台型 | 网络 | 这个例子的必要价值。启动应用程序类型的必要和可选设置。 |
API权限 | api://{clientId}/user_impersonation | 通过使用上一步中的新应用程序(客户端)ID 在 API 中搜索来添加委托类权限。然后选择user_impersonation 。此示例的必要值。 |
客机密码 | Azure 门户中显示的价值 | ⚠️马上记下这个值!它只显示一次(当您创建它时)。 |
ℹ️表中的粗体文本与Azure门户中的UI元素匹配(或类似),同时
code formatting
显示您在文本中输入的价值或在Azure门户中选择的价值。
三、修改web API应用更新以下设置引用cUrl app
应用程序注册表设置 | 此示例应用程序的价值 | 笔记 |
---|---|---|
已知道客户终端应用程序 | 在步骤 2 中创建的应用程序的客户端 ID (UUID)。 | 这个例子的必要价值。 |
在代码编辑器中打开protected-api-access-protected-api/appsettings.json文件并修改以下代码:
JSON"ClientId": "Enter_the_Application_Id_here","TenantId": "Enter_the_Tenant_Info_here","ClientSecret": "Enter_the_Client_Secret_here"
执行以下命令以启动并运行应用程序:
狂欢dotnet run
Web API 开始侦听后,执行以下命令将请求发送到其受到保护的端点。
狂欢curl -X GET https://localhost:5001/api/me -ki
ℹ️ 前期的反应是401 Unauthorized
因为您向保护的终点发了一个请求,但没有包含访问令牌(作为不记名令牌)。
使用Postman、curl或类似工具向https://localhost:5001/me发送HTTP GET请求,这次Authorization
包Bearer {valid-access-token}
。
如果一次正常,受到保护的Web API 应返回类似于以下内容的响应:
控制台curl -X GET https://localhost:5001/api/me -ki -H "Authorization: Bearer {valid-access-token}"{ "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users/$entity", "businessPhones": [], "displayName": "Maui", "givenName": null, "jobTitle": "dev", "mail": null, "mobilePhone": null, "officeLocation": null, "preferredLanguage": null, "surname": null, "id": "cff40dac-17ea-4183-9caf-65f2ee90c562"}
ℹ️ 预期的响应代码是200 OK
您是否在请求中包含有效的访问令牌作为不记名令牌。
这个 ASP.NET Core 最小 Web API 有一个受保护的路由 ( /api/me),它要求调用者(向终结点发出请求的客户端应用程序)提供由 Microsoft 标识平台颁发的有效访问令牌。
作为中间层 API,这个最小的 Web API 然后使用该访问令牌代表用户从 Microsoft 身份平台获取第二个访问令牌,这次是针对 Microsoft Graph。
最后,Web API 从 Microsoft Graph/me
终结点请求数据,并在其对原始调用方的响应中包含响应数据。
该项目使用Microsoft.Identity.Web api 与Microsoft Authentication Library (MSAL) for .NET进行交互。它代表用户获取访问令牌,将生成的令牌缓存在内存中。如果先前缓存了访问令牌,则对/api/me 的后续调用将尝试重用缓存的访问令牌,并在快过期时刷新它。MSAL 正在记录信息条目,说明何时获取、缓存和重新使用新的访问令牌。
如果您无法使示例工作,您已经检查了Stack Overflow,并且您已经搜索了该示例存储库中的问题,打开一个问题报告问题。
在存储库中搜索GitHub 问题- 你的问题可能已经被报告或有答案。没有相象之处?打开一个问题,清楚地解说您在运行显示示例应用程序时遇到的问题。⚠️ 警告:任何不限于运行此显示示例应用程序或其他示例应用程序的问题都将在未到解决的情况下关闭。
针对所有其他请求,请参阅面向开发人员的支持和帮助选项|微软件身份平台。
如果您想要为此做贡献,请参与CONTRIBUTING.MD。
该项目采用了Microsoft Open Source Code of Conduct。有关详细信息,请参考执行为准则常见问题解答或联系opencode@microsoft.com提出任何其他问题或意见。
关键词: