在入門1、入門二咱們實現了一個完整的API保護的過程。須要保護的API只需在其Controler上應用[Authorize]特性,來顯式指定受保護的資源。而咱們實現的這個例子,所應用的模式叫「Client Credentials」,在Config.cs中有這麼一段代碼
html
「Client Credentials」(客戶端憑證)模式,是最簡單的受權模式,由於受權的流程僅發生在Client與Identity Server之間。web
該模式的適用場景爲服務器與服務器之間的通訊。好比對於一個電子商務網站,將訂單和物流系統分拆爲兩個服務分別部署。物流系統須要獲取須要派送的物品,而訂單系統須要跟蹤物流信息。而這兩個系統之間服務的受權就能夠經過這種模式來實現。api
官方客戶受權幾種說明:https://identityserver4.readthedocs.io/en/latest/topics/clients.html瀏覽器
OAuth2.0 定義了四種受權模式:服務器
就是認證服務器提供網頁進行登陸。受保護的網站使用該模式,訪問須要受權的網頁時若是沒認證的會自動跳轉到認證服務器的登陸界面,登陸後自動回到原來訪問的受權頁面。mvc
用戶須要向客戶端提供本身的用戶名和密碼。客戶端使用這些信息,向"服務商提供商"索要受權。ide
在這種模式中,用戶必須把本身的密碼給客戶端,這一般用在用戶對客戶端高度信任的狀況下,好比客戶端是操做系統的一部分,或由一個著名公司出品。通常不建議使用該模式。認證服務器只有在其餘受權模式沒法執行的狀況下,才應考慮使用這種模式。網站
咱們使用第三方使用QQ賬號進行登陸的例子說明spa
這有一篇不錯的說明,上圖也來自該網頁
http://www.javashuo.com/article/p-nzebpclj-gb.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