有关身份验证和Web API的问题

时间:2018-02-18 15:20:16

标签: c# angular authentication asp.net-web-api azure-ad-b2c

我想为我的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。

0 个答案:

没有答案