Kaf*_*Kaf 5 multi-tenant asp.net-web-api owin-middleware openid-connect azure-ad-b2c
当前场景:
Web App 和 Web API 使用 AAD B2C 进行身份验证并且工作正常。每个客户都有一个唯一的租户。OpenIdConnectAuthenticationOptions(web app) 和 OAuthBearerAuthenticationOptions(api) 在应用程序中设置Startup。
如此处所述:使用 Azure AD B2C 对 Web 应用程序和 Web API 进行基于令牌的身份验证
不幸的是,必须为每个客户部署 Web 应用程序和 API,以将它们分开。
要求: 为多个客户使用相同的 Web 应用程序和 API,而不是为每个客户部署它们。每个客户都有不同的 Web 应用程序 URL。
问题 1(Web 应用程序):如何根据请求 URL 将(用于身份验证)用户重定向到正确的租户?
即OpenIdConnectAuthenticationOptions基于Request.Url应用程序而不是应用程序从数据库(或内存)动态设置(租户、应用程序ID、signInPolicy 等)Startup。
问题 2(API):如何使用正确的租户验证收到的令牌?
即OAuthBearerAuthenticationOptions根据收到的令牌 clientId 即时设置配置,而不是在应用程序中Startup
根据 @ManishJoisar 的请求,这就是我很久以前解决问题的方法。这是旧的 .net Framework 4.8 代码示例。
请注意,如今,B2C v2 策略通过自定义策略提供了更好的联合实施。
public void ConfigureAuth(IAppBuilder app)
{
int index = 2000;
foreach (var record in SystemConfig.ApiToWebUrl)
{
app.MapWhen(
context => System.Web.HttpContext.Current.Request.Url.BaseURL() == record.Key,
config =>
{
var customer = SystemConfig.GetWebSettings(true)[record.Value];
config.UseOAuthBearerAuthentication(CreateBearerOptionsFromPolicy(index, customer.B2CSignInPolicyId,
customer.B2CAadInstance, customer.B2CTenant, customer.B2CApplicationId));
}
);
index++;
}
}
public OAuthBearerAuthenticationOptions CreateBearerOptionsFromPolicy(int index, string b2cPlicyName,
string b2cInstance, string b2cTenant, string b2cClientId)
{
TokenValidationParameters tvps = new TokenValidationParameters
{
// This is where you specify that your API only accepts tokens from its own clients
ValidAudience = b2cClientId,
AuthenticationType = string.Format("{0}_{1}", b2cPlicyName, index)
};
var aadInstance = string.Format("https://{0}{1}", b2cTenant.Split('.')[0], ".b2clogin.com/{0}/{1}/v2.0/.well-known/openid-configuration");
var config = String.Format(aadInstance, b2cTenant, b2cPlicyName);
return new OAuthBearerAuthenticationOptions
{
// This SecurityTokenProvider fetches the Azure AD B2C metadata & signing keys from the OpenIDConnect metadata endpoint
AccessTokenFormat = new JwtFormat(tvps, new OpenIdConnectCachingSecurityTokenProvider(config)),
Provider = new CustomOAuthBearerProvider()
};
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
958 次 |
| 最近记录: |