Azure身份验证从客户端应用程序到另一个API



我试图在Blazor WASM应用程序和我在本地运行但在不同端口上的另一个API之间获得azure AD身份验证。我需要两个应用程序都使用Azure登录,但我只希望用户必须在Blazor应用程序上登录一次,然后将这些凭据传递给API。

我已经在门户中为两个应用程序设置了应用程序注册,创建了重定向url,暴露了具有作用域的API,我可以成功登录到blazor应用程序并使用@context.User.Identity.Name查看我的名字。

当它试图调用API时,我得到一个401错误返回,它没有在API中击中任何断点(大概是因为在http请求中没有传递身份验证)。

我在Blazor应用程序中的代码设置了一个http客户端,其基本地址设置为API:

public static async Task Main(string[] args)
{
var builder = WebAssemblyHostBuilder.CreateDefault(args);
builder.RootComponents.Add<App>("#app");
builder.Services.AddHttpClient("APIClient", client => client.BaseAddress = new Uri("https://localhost:11001"))
.AddHttpMessageHandler<BaseAddressAuthorizationMessageHandler>();
builder.Services.AddScoped(sp => sp.GetRequiredService<IHttpClientFactory>().CreateClient("APIClient"));
builder.Services.AddMsalAuthentication<RemoteAuthenticationState, CustomUserAccount>(options =>
{
builder.Configuration.Bind("AzureAd", options.ProviderOptions.Authentication);
options.ProviderOptions.DefaultAccessTokenScopes.Add("api://d3152e51-9f5e-4ff7-85f2-8df5df5e2b2e/MyAPI");
//options.UserOptions.RoleClaim = "appRole";
});
await builder.Build().RunAsync();
}

在我的API中,我只在类上设置了Authorise属性,最终也需要在那里设置角色:

[Authorize]
[Route("api/[controller]")]
[ApiController]
public class CarController

之后,在我Blazor组件,然后注入http工厂和试图使一个请求:

@inject IHttpClientFactory _factory
...
private async Task RetrieveCars()
{
var httpClient = _factory.CreateClient("APIClient");
HttpResponseMessage response = await httpClient.GetAsync("https://localhost:11001/api/cars");
var resp = await response.Content.ReadAsStringAsync();
cars = JsonSerializer.Deserialize<List<Car>>(resp);
}

但是返回401错误。我也尝试了一些不同的变化,如只是注入一个http客户端(@inject HttpClient http),但似乎没有添加我的授权到API调用。在AddMsalAuthentication部分的options. useroptions . rolecclaim也被注释掉了,因为我不确定它是否需要,但是不管有没有它都不能工作。

谁能解释一下我做错了什么,我应该使用什么代码?

常见原因

  • 大多数情况下,我们倾向于在给予API后忘记授予同意在公开API之后,应用程序注册门户中的权限这可能导致未经授权的错误。
  • 另一件事是当观众不匹配"aud"声明时,我们在jwt中跟踪令牌。确保配置了Audience=clientId在代码中的身份验证方案或令牌验证参数通过给予validaudience。并尝试使用和不使用api://前缀
  • 有时候,由于我们错误地发送了ID令牌,因此索赔不匹配而不是访问令牌,因为访问令牌意味着调用api确保在门户中勾选ID令牌和访问令牌
  • 同时启用身份验证通过注射(授权)属性到Razor页面。还要添加参考Microsoft.AspNetCore.Authorization (@usingMicrosoft.AspNetCore.Authorization)

请参阅MS文档中的说明和一些常见错误

如果不是上述情况,请提供额外的错误详细信息和启动配置或您正在遵循的任何链接以进一步调查。

最新更新