在Azure中使用托管身份进行服务到服务身份验证

时间:2020-04-25 18:36:17

标签: azure authentication azure-active-directory bearer-token azure-managed-identity

从我的Azure函数中,我试图访问已注册为Azure应用的另一项自定义服务的API终结点。我为天蓝色功能启用了托管身份。我使用以下代码获取令牌:

const makeButton = (text = "", onclick = event => null) =>
{ const b = document.createElement("button")
  b.onclick = onclick
  b.appendChild(document.createTextNode(text))
  return b
}

const makeInput = (name = "", value = "") =>
{ const i = document.createElement("input")
  i.name = name
  i.value = value
  return i
}

const counter = (name = "", value = 0) =>
{ const elem = document.createElement("div")
  const input = makeInput(name, value)
  const update = f => event =>
    (value = f(value), input.value = value)
  
  input.disabled = true
  elem.appendChild(makeButton("+", update(x => x + 1)))
  elem.appendChild(makeButton("-", update(x => x - 1)))
  elem.appendChild(input)
  return elem
}

document.body.appendChild(counter("a"))      // <input name="a" value="0">
document.body.appendChild(counter("b", 3))   // <input name="b" value="3">
document.body.appendChild(counter("c", 5))   // <input name="c" value="5">

似乎很好,因为我收到了不记名令牌。但是当我尝试使用令牌调用服务本身时:

var tokenIssuerAddress = @"uriOfServiceThatImTryingToConsume";
var tokenProvider = new AzureServiceTokenProvider("RunAs=App");
var accessToken = await tokenProvider.GetAccessTokenAsync(tokenIssuerAddress);

我得到200 OK,但是响应是一个以以下内容开头的HTML页面:

using (var client = new HttpClient())
{
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", $"{accessToken}");
    var response = await client.GetAsync($"{uriOfServiceThatImTryingToConsume}{path}");
}

当我使用获得的承载令牌时,为什么会得到HTML登录页面作为响应?我错过了一步吗?

2 个答案:

答案 0 :(得分:1)

通过将api注册为Azure中的应用程序,您已经做了正确的事。您还必须添加身份验证中间件,例如

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

答案 1 :(得分:0)

假设您获得的承载令牌有效且符合您的期望(您随时可以decode查看其声明),那么您需要提供有关正在调用的特定服务的更多详细信息。该服务可能需要2FA或具有您的承载令牌不符合的其他身份验证强度策略,从而重定向到继续进行身份验证。