1. 程式人生 > >第41章 CORS - Identity Server 4 中文文檔(v1.0.0)

第41章 CORS - Identity Server 4 中文文檔(v1.0.0)

應用程序 lec 裝飾 conf tst client 模式 ria logger

第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)。

github地址

第41章 CORS - Identity Server 4 中文文檔(v1.0.0)