使用Active Directory B2C来保护Blazor WASM应用程序和Web API



我有一个场景,我有一款Blazor WASM(仅限客户端(应用程序,它通过AD B2C进行安全保护。根据我阅读的文档,我已经在AD B2C中注册了一个应用程序(例如BlazorApp(,并将Blazor应用程序连接到此实例。这个Blazor应用程序对.NET Core Web API进行API调用,其中端点是安全的(使用[Authorize]属性(。根据我阅读的文档,我还在AD B2C中注册了Web API(例如WebApi(,并连接了API以连接到此实例。

我遇到的问题是,当我在Blazor应用程序中进行身份验证,然后通过API调用传递访问/id令牌时,Web API无法对该令牌进行身份验证(未经授权的错误响应(。当我连接Web API以连接到BlazorApp注册时,它就起作用了(我猜这是因为令牌是从那里发出的(。但这似乎违背了在AD中注册每个应用程序/api作为单独注册的建议。

如何获得WebApi注册以识别BlazorApp发布的代币?我说错了吗?我应该只是连接Web API来与BlazorApp实例对话吗?

附加信息:

Blazor WASM(客户端(-Program.cs(删除敏感信息(

public static async Task Main(string[] args)
{
var builder = WebAssemblyHostBuilder.CreateDefault(args);
builder.RootComponents.Add<App>("app");
...
builder.Services.AddMsalAuthentication(options =>
{
builder.Configuration.Bind("AzureAdB2C", options.ProviderOptions.Authentication);
options.ProviderOptions.DefaultAccessTokenScopes.Add(@"https://<tenant name>.onmicrosoft.com/blazorapp/app.read");
options.ProviderOptions.DefaultAccessTokenScopes.Add(@"https://<tenant name>.onmicrosoft.com/blazorapp/app.write");
});
...
await builder.Build().RunAsync();
}

Blazor WASM(客户端(-appsettings.json(删除敏感信息(

{
"AzureAdB2C": {
"Authority": "https://<tenant name>.b2clogin.com/<tenant name>.onmicrosoft.com/B2C_1_SignUpSignIn",
"ClientId": "<BlazorApp Application ID>",
"ValidateAuthority": false
}
}

Web API(.NET Core 3.1(-启动.cs(删除敏感信息(

public void ConfigureServices(IServiceCollection services)
{
...
services.AddAuthentication(AzureADB2CDefaults.BearerAuthenticationScheme)
.AddAzureADB2CBearer(options => Configuration.Bind("AzureAdB2C", options));
services.AddControllers();
...
}

Web API(.NET Core 3.1(-appsettings.json(删除敏感信息(

注意:当我用BlazorApp应用程序ID 替换WebApi应用程序ID时,身份验证有效

{
"AzureAdB2C": {
"Instance": "https://<tenant name>.b2clogin.com/tfp/",
"ClientId": "<WebAPI Application ID>",
"Domain": "<tenant name>.onmicrosoft.com",
"SignUpSignInPolicyId": "B2C_1_SignUpSignIn"
},
...
}

您的项目没有使用OBO流,OBO流需要三个应用程序,特别是一个client-side和两个api-side,请参阅此处。

回到问题上来,首先你的问题是作用域配置错误,因为api-side应用程序需要公开自己的api,你的blazor应用程序端的API权限可以访问api-side,所以对作用域的访问是在api-side上配置的,所以我们需要将https://<tenant name>.onmicrosoft.com/webapiapp/app.read放在作用域上,你的blazor应用仅用于配置访问。

它之所以有效,是因为你使用blazor应用程序请求blazor程序自己的api,这是可行的,尽管有点奇怪,但请求自己。

因此,对于您的项目,正确的请求应该是这样的。

public static async Task Main(string[] args)
{
var builder = WebAssemblyHostBuilder.CreateDefault(args);
builder.RootComponents.Add<App>("app");
...
builder.Services.AddMsalAuthentication(options =>
{
builder.Configuration.Bind("AzureAdB2C", options.ProviderOptions.Authentication);
options.ProviderOptions.DefaultAccessTokenScopes.Add(@"https://<tenant name>.onmicrosoft.com/webapiapp/app.read");
options.ProviderOptions.DefaultAccessTokenScopes.Add(@"https://<tenant name>.onmicrosoft.com/webapiapp/app.write");
});
...
await builder.Build().RunAsync();
}
{
"AzureAdB2C": {
"Instance": "https://<tenant name>.b2clogin.com/tfp/",
"ClientId": "<Application ID>",
"Domain": "<tenant name>.onmicrosoft.com",
"SignUpSignInPolicyId": "B2C_1_SignUpSignIn"
},
...
}

相关内容

  • 没有找到相关文章

最新更新