azure - 在 Azure 中使用托管标识进行服务到服务身份验证
问题描述
从我的 Azure 函数中,我尝试访问已在 azure 中注册为应用程序的另一个自定义服务的 API 端点。我为我的天蓝色功能启用了托管身份。我使用以下代码获取令牌:
var tokenIssuerAddress = @"uriOfServiceThatImTryingToConsume";
var tokenProvider = new AzureServiceTokenProvider("RunAs=App");
var accessToken = await tokenProvider.GetAccessTokenAsync(tokenIssuerAddress);
这似乎很好,因为我得到了一个不记名令牌。但是当我尝试使用令牌调用服务本身时:
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", $"{accessToken}");
var response = await client.GetAsync($"{uriOfServiceThatImTryingToConsume}{path}");
}
我得到 200 OK 但响应是一个 HTML 页面,以以下内容开头:
<!-- Copyright (C) Microsoft Corporation. All rights reserved. -->
<!DOCTYPE html>
<html dir="ltr" class="" lang="en">
<head>
<title>Sign in to your account</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=2.0, user-scalable=yes">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="-1">
<link rel="preconnect" href="https://aadcdn.msftauth.net" crossorigin>
<meta http-equiv="x-dns-prefetch-control" content="on">
<link rel="dns-prefetch" href="//aadcdn.msftauth.net">
<link rel="dns-prefetch" href="//aadcdn.msauth.net">
当我使用我获得的不记名令牌时,为什么我会获得一个 HTML 登录页面作为响应?我错过了一步吗?
解决方案
通过在 Azure 中将 api 注册为应用程序,您已经做了正确的事情。您还必须添加身份验证中间件,例如
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(o =>
{
AuthenticationSettings settings = Configuration.GetSection("Authentication").Get<AuthenticationSettings>();
o.Authority = settings.Authority;
o.TokenValidationParameters = new TokenValidationParameters
{
ValidAudiences = new[]
{
settings.ClientId,
settings.ApplicationIdUri
}
};
});
然后在管道中添加“UseAuthentication”。看看这是否有帮助。
推荐阅读
- python - Python Pandas groupby:根据值的条件过滤和应用
- android - 如何在一个登录页面中有多个用户
- c - 将值分配给结构数组
- vba - 错误 1004 无论如何 - 从第一个到最后一个动态
- swift - SWIFT:WKWebView:填写登录数据
- sprite - Godot - 我可以像素化一个节点(Sprite)吗?
- c# - 使用 vb.net,挂钩指定的 USB 键盘,接收所需控制的字符并将接收到的字符阻止到其余窗口
- python - 如何使用 request 和 bs4 发出多个请求
- r - 并行化函数 poly2nb {spdep}
- python - 安装新窗口后运行现有 python 程序时出现文件和目录错误