C# 关于身份验证和Web API的问题

C# 关于身份验证和Web API的问题,c#,angular,authentication,asp.net-web-api,azure-ad-b2c,C#,Angular,Authentication,Asp.net Web Api,Azure Ad B2c,我想为我的WebAPI2OData4应用程序创建一个层来抽象身份验证的细节,以便最终用户可以选择哪个身份验证提供者。现在,应用程序的结构是使用Microsoft B2C对UI中的用户进行身份验证,并相应地将用户重定向到Angular2页面。所有与B2C之间的重定向逻辑都硬编码到UI中。此时,将从URL中提取令牌,并根据需要对其进行解码,以获取用户名和客户端ID信息。当UI调用API时,它将用户名和ClientID传递给实现OAuth的服务。API将客户机ID与可接受列表匹配,并相应地提供数据。这

我想为我的WebAPI2OData4应用程序创建一个层来抽象身份验证的细节,以便最终用户可以选择哪个身份验证提供者。现在,应用程序的结构是使用Microsoft B2C对UI中的用户进行身份验证,并相应地将用户重定向到Angular2页面。所有与B2C之间的重定向逻辑都硬编码到UI中。此时,将从URL中提取令牌,并根据需要对其进行解码,以获取用户名和客户端ID信息。当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, ()=>{})
})
仅当身份验证服务已成功对用户进行身份验证时,才会发生这种情况。然后验证令牌并设置用户信息

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进行更改