C# 使用AAD身份验证从带有MSI的应用程序服务向另一个应用程序服务API发出HTTP请求

C# 使用AAD身份验证从带有MSI的应用程序服务向另一个应用程序服务API发出HTTP请求,c#,azure,authentication,azure-active-directory,azure-web-app-service,C#,Azure,Authentication,Azure Active Directory,Azure Web App Service,我试图做的是使用应用程序服务1中的MSI标识从应用程序服务1(MainWebApp)向应用程序服务2(AadAuthenticationApiOne-Dev)发出授权呼叫,该标识应在应用程序服务2上获得授权 虽然这应该不会太难,但我仍然无法让这个流程正常工作。可能是因为我遗漏了一些复选框。我尝试了很多方法,但一开始就完全遵循了 这意味着我拥有我的主Web应用程序的身份(对象Id:bf00c7e8-b14b-4fe5-b768-da255026ff17)和我的第二个应用程序服务的应用程序注册,称为

我试图做的是使用应用程序服务1中的MSI标识从应用程序服务1(MainWebApp)向应用程序服务2(AadAuthenticationApiOne-Dev)发出授权呼叫,该标识应在应用程序服务2上获得授权

虽然这应该不会太难,但我仍然无法让这个流程正常工作。可能是因为我遗漏了一些复选框。我尝试了很多方法,但一开始就完全遵循了

这意味着我拥有我的主Web应用程序的身份(对象Id:
bf00c7e8-b14b-4fe5-b768-da255026ff17
)和我的第二个应用程序服务的应用程序注册,称为AadAuthenticationApiOne(对象Id-
9863b99a-6f28-4053-8a47-050f2b6da1e7
/Application Id-
905ceb2e-8bde-48ca-bcbd-937b0ed30e67

正如blogpost中所述,我在应用程序注册中添加了一个应用程序角色。只是为了尝试,我从他的帖子中复制粘贴了完整的块,以查看我是否能让它工作

{
“批准”:[
{
“AllowedMemberType”:[
“应用程序”
],
“显示名称”:“读取所有内容”,
“id”:“32028ccd-3212-4f39-3212-beabd6787d81”,
“isEnabled”:没错,
“说明”:“允许应用程序以自身的方式读取所有内容。”,
“价值”:“事物。阅读。全部”
}
]
}
之后,我通过运行以下脚本为我的MSI添加了一个新角色分配

新AzureADServiceAppRoleAssignment`
-目标bf00c7e8-b14b-4fe5-b768-da255026ff17`
-Id 32028ccd-3212-4f39-3212-beabd6787d81`
-PrincipalId bf00c7e8-b14b-4fe5-b768-da255026ff17`
-资源ID 9863b99a-6f28-4053-8a47-050f2b6da1e7
为了从我的MainWebApp获取访问令牌,我运行了以下代码

var azureServiceTokenProvider = new AzureServiceTokenProvider();
string accessToken = await azureServiceTokenProvider.GetAccessTokenAsync("905ceb2e-8bde-48ca-bcbd-937b0ed30e67", "b1f8cb55-7d7a-4e8d-9641-51372b423357");
// And I also tried the following
var azureServiceTokenProvider = new AzureServiceTokenProvider();
string accessToken = await azureServiceTokenProvider.GetAccessTokenAsync("https://[mine].onmicrosoft.com/6c14b806-7fec-4423-88e9-ce535e07787a");
这两种方法都会生成一个有效的JWT,这对于folliwing示例来说很熟悉

{
“aud”:“905ceb2e-8bde-48ca-bcbd-937b0ed30e67”,
“国际空间站”:https://sts.windows.net/b1f8cb55-7d7a-4e8d-9641-51372b423357/",
“iat”:1574427342,
“nbf”:1574427342,
“经验”:1574456442,
“aio”:“42VgYHjp+2HQNDCYIVLGHLFLNFOMAA=”,
“appid”:“a4e07406-b556-4c4d-9525-5f410fd21fe7”,
“应用程序”:“2”,
“国内流离失所者”:https://sts.windows.net/b1f8cb55-7d7a-4e8d-9641-51372b423357/",
“oid”:“bf00c7e8-b14b-4fe5-b768-da255026ff17”,
“角色”:[
“事情,阅读,一切”
],
“接头”:“bf00c7e8-b14b-4fe5-b768-da255026ff17”,
“tid”:“b1f8cb55-7d7a-4e8d-9641-51372b423357”,
“uti”:“FRQIC0BOX0IMFREVC1ZHA”,
“版本”:“1.0”
}
但是,当调用API时,我会收到一个页面,说明
登录您的帐户
。 调用API的代码

\u httpClient.DefaultRequestHeaders.Authorization=新的AuthenticationHeaderValue(“承载者”,accessToken);
var response=await\u httpClient.GetAsync(“https://myaadauthapi.azurewebsites.net/api/data");
API控制器中的方法如下所示


[Authorize(Roles=“Things.Read.All”)]/您似乎已经在API上使用OpenID Connect配置了Azure AD身份验证。这不是正确的方法。API应配置Azure AD承载令牌身份验证。它不重定向请求,它需要访问令牌。我也有关于该设置的文章;)


感谢您阅读我的文章:)您似乎已经在API上使用OpenID Connect配置了Azure AD身份验证。这不是正确的方法。API应配置Azure AD承载令牌身份验证。它不重定向请求,它需要访问令牌。我也有关于该设置的文章;)我这么做可能是因为我对这些东西不太熟悉。我会马上在你的博客上搜索。谢谢你指出我犯的错误。这里有一个到第一部分的链接:我找到并修复了它!谢谢如果你在答案中链接它,我会立即将其标记为已回答。我会对这件事做更多的研究,试图了解我实际上在做什么。
// The additions I did in the ConfigureServices method in Startup class
services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
    .AddAzureAD(options =>
    {
        Configuration.Bind("AzureAd", options);
    });

// And of course the addition to the Configure method
app.UseAuthentication();