2017-01-23 77 views

回答

4

客戶機密用於授權訪問token endpoint。此端點使用客戶端ID和客戶端密鑰,並允許您請求訪問令牌。

範圍祕密用於授權訪問introspection endpoint。此端點使用作用域標識和作用域祕密,因爲只有包含在訪問標識中的作用域才允許對其進行自省。

6

感謝Scott Brady,我能夠回答我的問題。下面是我發現了什麼......

客戶端祕密

正如Scott Brady說,當你的客戶端應用程序調用token end point客戶端祕密被使用。這種方式只有授權的客戶端應用程序才能訪問端點。您的客戶端應用程序必須具有有效的客戶端ID和客戶端密鑰才能調用令牌端點。

範圍祕密

但是,如果你的資源服務器需要調用IdentityServer?當資源服務器調用access token end point時會發生這種情況。當您的應用程序使用引用令牌時(這必須通過調用訪問令牌端點來驗證),或者您已選擇通過驗證端點驗證JWT,則會發生這種情況。因此,假設您的身份驗證客戶端調用資源服務器上的受保護端點。資源服務器必須使用auth服務器(您正在使用的IdentityServer實施)驗證該令牌。但是,從資源服務器發送到auth服務器的請求必須具有身份驗證信息。如果你的資源服務器使用了它試圖驗證的身份驗證方式的相同訪問令牌,這將是愚蠢的(並且違反了協議)。所以現在有一個問題...資源服務器如何發送驗證請求的驗證信息?

這是範圍祕密進來的地方。IdentityServer解決這個問題的方式是允許您創建一個包含範圍祕密的範圍。此範圍已添加到資源服務器身份驗證選項中。例如:

app.UseIdentityServerBearerTokenAuthentication(
       new IdentityServerBearerTokenAuthenticationOptions 
       { 
        Authority = "http://localhost:5000", 
        ClientId = "api", //The Scope name 
        ClientSecret = "api-secret", //This is the non hashed/encrypted Scope Secret 
        RequiredScopes = new[] { "api" } //Must add the Scope name here since it has to be required 
       }); 

通過使該範圍需要,我們可以確保任何身份驗證客戶端應用程序都會有這個範圍。資源服務器對令牌驗證端點時,它會簡單地使用範圍祕密作爲客戶端密鑰和範圍的名稱作爲客戶端調用所以當

new Scope 
    { 
     Name = "api", 
     DisplayName = "Scope DisplayName", 
     Description = "This will grant you access to the API", 

     //The secret here must be Sha256-ed in order for the /introspection end point to work. 
     //If the API's IdentityServerBearerTokenAuthenticationOptions field is set as so ValidationMode = ValidationMode.ValidationEndpoint, 
     //then the API will call the /introspection end point to validate the token on each request (instead of ValidationModel.ValidationLocal. 
     //The ClientSecret must be the NON Sha256-ed string (for example Api = "api-secret" then scope secret must = "spi-secret".Sha256()) 
     //for the token to be validated. There must be a Scope that has the same name as the ClientId field in IdentityServerBearerTokenAuthenticationOptions. 
     //This is an API authenticates with IdentityServer 
     ScopeSecrets = new List<Secret> 
         { 
           new Secret("api-secret".Sha256()) 
         }, 
      Type = ScopeType.Resource 
     } 

:然後在IdentityServer將添加範圍,像這樣ID。

相關問題