从我的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登录页面作为响应?我错过了一步吗?
答案 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或具有您的承载令牌不符合的其他身份验证强度策略,从而重定向到继续进行身份验证。