Blazor WASM中的Microsoft Identity Web无效令牌

时间:2020-06-13 14:30:19

标签: .net-core azure-active-directory blazor microsoft-identity-platform

我刚刚尝试实现此操作:https://github.com/Azure-Samples/active-directory-dotnet-native-aspnetcore-v2/tree/master/1.%20Desktop%20app%20calls%20Web%20API

我使用Blazor WASM客户端,而不是使用WPF应用程序。

我将令牌添加到.net核心API的传出请求中,但始终收到401。

Blazor进行了很好的身份验证,并获得了令牌,似乎工作正常,但是:

  • 观众的GUID错误
  • 缺少“ scp”(作用域),因此令牌无法使用

如果我从上面提到的链接中运行示例并解码令牌,则可以在令牌中看到正确的AUD和SCP。因此,可能与我在Blazor中的配置有关?

在Blazor中配置

// AD authentication
builder.Services.AddMsalAuthentication(options =>
{
    builder.Configuration.Bind("AzureAd", options.ProviderOptions.Authentication);
    options.ProviderOptions.DefaultAccessTokenScopes.Add("api://xxx-xxxx-xxxx-xxxx/access_as_user");
});

builder.Services
       .AddHttpClient<IApiClient, ApiClient>(client => client.BaseAddress = _baseUri)
       .AddHttpMessageHandler<BaseAddressAuthorizationMessageHandler>();

回复

Bearer error="invalid_token", error_description="The audience '63ee4227-xxxx-xxxx-xxxx' is invalid"

观众GUID是我的Blazor应用注册的clientID

Startup.cs中的代码

...
services.AddProtectedWebApi(Configuration)
        .AddInMemoryTokenCaches();
...

...
app.UseAuthentication(); 
app.UseAuthorization();
...

有什么主意吗?

1 个答案:

答案 0 :(得分:0)

当我学习使用Blazor WebAssembly时,我遵循了this tutorial,它的功能非常相似,而且您不必尝试从WPF转换任何代码,对您来说可能更容易实现。

不过,要尝试的一件事就是更改此设置:

foreach($arr as $el){
            $ht .= "<div class='atitle' 
                 //foreach column in users $ht .= "data-" . column_name = column_value
            $ht .= ">" . $el['title'] . "</div>\n";
        }

对此:

options.ProviderOptions.DefaultAccessTokenScopes.Add("api://xxx-xxxx-xxxx-xxxx/access_as_user");

在我的应用程序中,我正在调用两个API终结点,一个终结点托管在Blazor应用程序的同一个域中,另一个终结点位于单独的域中。请求外部域令牌时,必须使用 api:// 前缀。但是,对于同一域,必须将其排除。