第41章 CORS IdentityServer中的許多端點將通過基於JavaScript的客戶端的Ajax調用進行訪問。鑒於IdentityServer最有可能托管在與這些客戶端不同的源上,這意味著需要配置 "跨源資源共用" (CORS)。 41.1 基於客戶端的CORS配置 配置CORS的一種方 ...
第41章 CORS
IdentityServer中的許多端點將通過基於JavaScript的客戶端的Ajax調用進行訪問。鑒於IdentityServer最有可能托管在與這些客戶端不同的源上,這意味著需要配置跨源資源共用(CORS)。
41.1 基於客戶端的CORS配置
配置CORS的一種方法是在客戶端配置上使用AllowedCorsOrigins
該集合。只需將客戶端的原點添加到集合中,IdentityServer中的預設配置將查詢這些值以允許來自源的跨源調用。
註意
配置CORS時,請務必使用原點(不是URL)。例如:https://foo:123/
是一個URL,而是https://foo:123
一個原點。
如果您使用我們提供的“記憶體中”或基於EF的客戶端配置,則將使用此預設CORS實現。如果您定義自己的IClientStore
,那麼您將需要實現自己的自定義CORS策略服務(見下文)。
41.2 自定義Cors策略服務
IdentityServer允許托管應用程式實現ICorsPolicyService
完全控制CORS策略。
要實現單一的方法是:Task<bool> IsOriginAllowedAsync(string origin)
。如果允許原點則返回true,否則返回false
實現後,只需在DI中註冊實現,然後IdentityServer將使用您的自定義實現。
41.2.1 DefaultCorsPolicyService
如果您只是希望對一組允許的原點進行硬編碼,那麼您可以使用一個預先構建ICorsPolicyService
的實現調用DefaultCorsPolicyService
。這將被配置為DI單例,並以其硬編碼的AllowedOrigins
收集,或設置標誌AllowAll
為true允許所有的源點。例如,在ConfigureServices
:
var cors = new DefaultCorsPolicyService(_loggerFactory.CreateLogger<DefaultCorsPolicyService>())
{
AllowedOrigins = { "https://foo", "https://bar" }
};
services.AddSingleton<ICorsPolicyService>(cors);
註意
AllowAll謹慎使用。
41.3 將IdentityServer的CORS策略與ASP.NET Core的CORS策略混合
IdentityServer使用ASP.NET Core的CORS中間件來提供其CORS實現。托管IdentityServer的應用程式可能還需要CORS用於自己的自定義端點。通常,兩者應該在同一個應用程式中一起工作。
您的代碼應使用ASP.NET Core中記錄的CORS功能,而不考慮IdentityServer。這意味著您應該定義策略並正常註冊中間件。如果您的應用程式在ConfigureServices
中定義了策略,那麼這些策略應繼續在您使用它們的相同位置(在您配置CORS中間件的地方或在EnableCors
控制器代碼中使用MVC 屬性的位置)。相反,如果您使用CORS中間件(通過策略構建器回調)定義內聯策略,那麼它也應該繼續正常工作。
您使用ASP.NET Core CORS服務與IdentityServer之間可能存在衝突的一種情況是您決定創建自定義ICorsPolicyProvider
。鑒於ASP.NET Core的CORS服務和中間件的設計,IdentityServer實現了自己的自定義ICorsPolicyProvider
並將其註冊到DI系統中。幸運的是,IdentityServer實現旨在使用裝飾器模式來包裝ICorsPolicyProvider
已在DI中註冊的任何現有模式 。這意味著你也可以實現ICorsPolicyProvider
,但它只需要在DI中的IdentityServer之前註冊(例如,在ConfigureServices
)。