首页 > 解决方案 > 在 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 登录页面作为响应?我错过了一步吗?

标签: azureauthenticationazure-active-directorybearer-tokenazure-managed-identity

解决方案


通过在 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”。看看这是否有帮助。


推荐阅读