我有一个 Blazor WASM 独立应用程序,它使用 Azure AD B2C 进行用户和令牌管理。
我见过有关此问题的其他问题/答案,但就我而言,这些方法均不起作用,并且我的 Blazor WASM 独立应用无法获取访问令牌。
我的 Blazor 应用在 Azure AD B2C 上设置为 SPA 应用,需要注意的是,“隐式授权和混合流”部分下的“访问令牌”和“ID 令牌”选项未选中。此外,“允许公共流”设置为“否”——见下文。对于这些设置,我只是按照此处的说明进行操作:https: //learn.microsoft.com/en-us/aspnet/core/blazor/security/webassembly/standalone-with-azure-active-directory-b2c ?view=aspnetcore-8.0#register-an-app-in-azure
我还在 Blazor WASM 应用的“配置权限”下为我的 API 添加了“读取”和“写入”范围 - 如下所示:
在 Blazor WASM 方面,我的外观如下Program.cs
:
...
builder.Services.AddMsalAuthentication(options =>
{
builder.Configuration.Bind("AzureAdB2C", options.ProviderOptions.Authentication);
options.ProviderOptions.LoginMode = "redirect";
//options.ProviderOptions.DefaultAccessTokenScopes.Add("openid");
//options.ProviderOptions.DefaultAccessTokenScopes.Add("offline_access");
options.ProviderOptions.DefaultAccessTokenScopes.Add("https://mytenant.onmicrosoft.com/api/MyApiUser.Write");
});
// Add HttpClient for My API calls
builder.Services.AddHttpClient("MyApiClient",
client => client.BaseAddress = new Uri("https://api.test.com"))
.AddHttpMessageHandler<BaseAddressAuthorizationMessageHandler>();
builder.Services.AddScoped(sp => sp.GetRequiredService<IHttpClientFactory>()
.CreateClient("MyApiClient"));
openid
请注意,我注释掉了和的范围offline_access
,但我也尝试了它们。无论如何,它不起作用,没有access_token
收到任何结果。
在这个 SO 问答中,开发人员建议使用 Blazor WASM 应用程序的应用程序 ID,而不是对他有用的范围 URI。我确实尝试了以下方法,但也没有用。这是那个问题:Blazor Standalone WASM 无法使用 MSAL 获取访问令牌
options.ProviderOptions.DefaultAccessTokenScopes.Add("cb3574c0-305e-4e44-a3b7-ac5f045f94e7"); // options.ProviderOptions.DefaultAccessTokenScopes.Add("https://mytenant.onmicrosoft.com/api/MyApiUser.Write");
此处GUID
的值cb3574c0-305e-4e44-a3b7-ac5f045f94e7
是 Azure AD B2C 为我的 Blazor WASM 应用分配的应用程序 ID。
当我检查HttpClient
我进行 API 调用的地方时,我发现DefaultRequestHeaders
是null
。
我不相信 Azure AD B2C 实际上会发送access_token
任何消息。知道我在这里做错了什么吗?
由于您传递了错误的范围,因此发生错误
https://mytenant.onmicrosoft.com/api/MyApiUser.Write
要解决该错误,请确保将范围传递为
var scopes = new[] { "openid", "profile", "offline_access" "https://mytenant.onmicrosoft.com/ClientID/ScopeName" };
通过传递有效范围来修改代码:
如果 Azure AD B2C 应用程序未设置为公共,通常会出现错误“提供的应用程序未配置为允许公共客户端。” 。
要解决该错误,请确保将“允许公共客户端流”设置为“是”:
还要确保将重定向 URL 配置为SPA。
参考:
c# - 从AuthenticationResult返回Null AccessToken -我的代码