我想为我的Web API 2 Odata4应用程序创建一个层来抽象身份验证的细节,以便最终用户可以选择他们选择的任何Auth提供程序。现在,应用程序的结构是使用Microsoft B2C在UI中验证用户,并相应地将用户重定向到Angular2页面。进出B2C的所有重定向逻辑都被硬编码到UI中。此时,令牌从URL中提取并根据需要进行解码以获取用户名和ClientID信息。当UI调用API时,它将该用户名和ClientID传递给实现OAuth的服务。 API将客户端ID与可接受的列表进行匹配,并相应地提供数据。大多数此过程似乎都硬编码到UI和API中。
这就是UI抓取令牌的方式:
sharedservice.id_token = location.hash.split('id_token=')[1];
authService.isLoggedIn = true;
fetch(sharedservice.JWKS_URL, {
method: 'GET'
}).then(res => res.json())
.then(json => {
this.getSigningKey(json.keys[0].kid, ()=>{})
})
只有在auth服务已成功验证用户身份时才会发生这种情况。然后验证令牌并设置用户信息。
API在app_start下的startup.auth.cs文件中获取身份验证服务设置,它看起来像这样:
// These values are pulled from web.config
public static string AadInstance = ConfigurationManager.AppSettings[" "];
public static string Tenant = ConfigurationManager.AppSettings[" "];
public static string ClientId1 = ConfigurationManager.AppSettings[" "];
public static string ClientId2 = ConfigurationManager.AppSettings[" "];
public static string ClientId3 = ConfigurationManager.AppSettings[" "];
public static string ClientId4 = ConfigurationManager.AppSettings[" "];
public static string SignUpSignInPolicy = ConfigurationManager.AppSettings[" "];
public static string DefaultPolicy = SignUpSignInPolicy;
public void Configuration(IAppBuilder app)
{
HttpConfiguration config = new HttpConfiguration();
// Web API routes
config.MapHttpAttributeRoutes();
ConfigureOAuth(app);
app.UseWebApi(config);
}
public void ConfigureOAuth(IAppBuilder app)
{
app.UseOAuthBearerAuthentication(CreateBearerOptionsFromPolicy(DefaultPolicy));
}
private OAuthBearerAuthenticationOptions CreateBearerOptionsFromPolicy(string policy)
{
var metadataEndpoint = string.Format(AadInstance, Tenant, policy);
TokenValidationParameters tvps = new TokenValidationParameters
{
// Accept only those tokens where the audience of the token is equal to the client ID of this app
ValidAudiences = new string[] { ClientId1, ClientId2, ClientId3, ClientId4 },
//ValidAudience = ClientId2,
AuthenticationType = Startup.DefaultPolicy
};
return new OAuthBearerAuthenticationOptions
{
// This SecurityTokenProvider fetches the Azure AD B2C metadata & signing keys from the OpenIDConnect metadata endpoint
AccessTokenFormat = new JwtFormat(tvps, new OpenIdConnectCachingSecurityTokenProvider(metadataEndpoint))
};
}
所有B2C配置似乎都是硬编码的。什么是最可接受的方式来抽象所有这些信息,以便应用程序可以与最终用户关心使用的任何服务集成,而不仅仅是B2C?我认为这样的解决方案需要更改Angular 2页面和API。