ASP.NET核心中的AzureAD B2C ROPC身份验证



我有一个使用AzureB2C进行身份验证的ASP.NET核心Web应用程序(REST API(。这是Startup.cs

public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddAuthentication(AzureADB2CDefaults.BearerAuthenticationScheme)
.AddAzureADB2CBearer(options =>
{
options.Instance = "https://tenant.b2clogin.com/tfp/";
options.ClientId = "...";
options.Domain = "tenant.onmicrosoft.com";
options.SignUpSignInPolicyId = "B2C_1A_signup_signin";
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints => { endpoints.MapControllers(); });
}
}

为了支持自动测试中的身份验证,我确实尝试过使用client credentialFlow,但发现AzureB2C中不支持它。接下来,我遇到了ROPC Flow,它被建议作为替代方案(例如:此处(。但我无法让它发挥作用。

如果我使用ROPC流接收到令牌。

dynamic result = await $"https://{tenantName}.b2clogin.com"
.AppendPathSegment($"{tenantName}.onmicrosoft.com")
.AppendPathSegment("B2C_1_ROPC_Auth")
.AppendPathSegment("oauth2/v2.0/token")
.SetQueryParams(new
{
client_id,
scope = $"6d1aa76b-10fb-47bb-bbec-5d7f7a4e08c4 openid offline_access",
username,
password,
grant_type = "password",
repsonse_type = "token id_token"
}
)
.PostAsync(new StringContent(""))
.ReceiveJson();

代币看起来不错且有效。但是,如果我试图使用它来验证我对RESTApi的调用,我会收到以下错误:

WWW身份验证承载错误=";invalid_token";,error_description=";未找到签名密钥";

经过一些调查,RestAPI似乎正在尝试使用我的B2C_1A_signup_signin策略的众所周知的配置来验证KID。这是有道理的,因为它是AddAzureADB2CBearer选项的一部分。如果我确实将策略更改为B2C_1_ROPC_Auth,则接受令牌。

但我确实需要这两个令牌,即使用B2C_1A_signup_signin流和ROPC流令牌创建的令牌。

如何配置我的应用程序以接受这两种配置?

如果此API仅通过无头身份验证访问,则使用Azure AD客户端凭据对其进行保护。您的Azure AD B2C中包含Azure AD。请按照此处的说明进行操作:https://learn.microsoft.com/en-us/azure/active-directory/develop/scenario-daemon-overview

最新更新