在入門一、入門二我們實現了一個完整的API保護的過程。需要保護的API只需在其Controler上應用[Authorize]特性,來顯式指定受保護的資源。而我們實現的這個例子,所應用的模式叫“Client Credentials”,在Config.cs中有這么一段代碼
“Client Credentials”(客戶端憑證)模式,是最簡單的授權模式,因為授權的流程僅發生在Client與Identity Server之間。
該模式的適用場景為服務器與服務器之間的通信。比如對於一個電子商務網站,將訂單和物流系統分拆為兩個服務分別部署。物流系統需要獲取需要派送的物品,而訂單系統需要跟蹤物流信息。而這兩個系統之間服務的授權就可以通過這種模式來實現。
官方客戶授權幾種說明:https://identityserver4.readthedocs.io/en/latest/topics/clients.html
OAuth2.0 定義了四種授權模式:
- Implicit:簡化模式;直接通過瀏覽器的鏈接跳轉申請令牌。
- Client Credentials:客戶端憑證模式;該方法通常用於服務器之間的通訊;該模式僅發生在Client與Identity Server之間。
- Resource Owner Password Credentials:密碼模式
- Authorization Code:授權碼模式;
Implicit
就是認證服務器提供網頁進行登錄。受保護的網站使用該模式,訪問需要授權的網頁時如果沒認證的會自動跳轉到認證服務器的登錄界面,登錄后自動回到原來訪問的授權頁面。
Resource Owner Password Credentials
用戶需要向客戶端提供自己的用戶名和密碼。客戶端使用這些信息,向"服務商提供商"索要授權。
在這種模式中,用戶必須把自己的密碼給客戶端,這通常用在用戶對客戶端高度信任的情況下,比如客戶端是操作系統的一部分,或由一個著名公司出品。一般不建議使用該模式。認證服務器只有在其他授權模式無法執行的情況下,才應考慮使用這種模式。
Authorization Code
我們使用第三方使用QQ帳號進行登錄的例子說明
這有一篇不錯的說明,上圖也來自該網頁
https://www.cnblogs.com/alittlesmile/p/11531577.html
一個認證服務器,可以應用兩種模式嗎?
可以的。后面的例子,我們要為入門一的例子上加上Implicit模式。下面源碼中的將是一個新的web的網站,使用44302端口
public static IEnumerable<Client> GetClients() { return new List<Client> { new Client { ClientId = "client", // no interactive user, use the clientid/secret for authentication AllowedGrantTypes = GrantTypes.ClientCredentials, // secret for authentication ClientSecrets = { new Secret("secret".Sha256()) }, // scopes that client has access to AllowedScopes = { "api1" } }, new Client { ClientId = "mvc", ClientName = "MVC Client", AllowedGrantTypes = GrantTypes.Hybrid, AllowOfflineAccess = true, ClientSecrets = { new Secret("secret".Sha256()) }, RedirectUris = { "https://localhost:44302/signin-oidc" }, PostLogoutRedirectUris = { "https://localhost:44302/" }, FrontChannelLogoutUri = "https://localhost:44302/signout-oidc", AllowedScopes = { IdentityServerConstants.StandardScopes.OpenId, IdentityServerConstants.StandardScopes.Profile, IdentityServerConstants.StandardScopes.Email, "api1", "api2.read_only" }, } }; }
各個模式的Client源碼,可以在這找
https://identityserver4.readthedocs.io/en/latest/topics/clients.html