1. 程式人生 > >一步一步學習IdentityServer3 (13) 令牌

一步一步學習IdentityServer3 (13) 令牌

jwt poi 信息 定義 icu 客戶 不同 env res

IdentityServer3中客戶端保護了授權資源,不難看出在IdentityServer3中,有這樣一個設置

  AllowedScopes = new List<string>
                    {
                    "clientservices"
                    }

通過上面的客戶端,拿到了四個授權範圍,比如我有一個WebApi的資源授權服務站點,如下面的設置

 app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
            {

                Authority 
= LYM.Unity.AppSetting.AppSettingsHelper.GetString("Authority"), ValidationMode = ValidationMode.ValidationEndpoint, RequiredScopes = new[] { "clientservices" } });

比較可以看出 通過客戶端拿到的授權範圍是可以訪問Webapi的資源服務,通過其他不包含clientservices的客戶端拿到的令牌是不具有這個webapi資源授權權限,所以客戶端中的Scope設置更好的把資源分類保護起來了,而我們要做的就是對資源分類,對不同的客戶端設置具體訪問的資源分類,具體業務看具體需求,比如同一個客戶端也可以同時具有多個資源訪問權限

技術分享

訪問令牌是根據客戶端設置的Scope範圍,頒發給客戶端的一個資源訪問的字符串令牌,這個令牌對客戶端是保密不透明的,客戶端通過資源擁有者提供的授權及授權範圍去訪問具體的授權資源,如現有很多微信、QQ 第三方登錄一樣的,我們用戶作為一個資源擁有者,而我們要訪問網站作為一個客戶端(這個客戶端QQ、微信授予的Client),我們的基本資料等作為我們的資源,當我們用微信訪問的時候會轉到微信登錄的一個客戶端(提示是具體客戶端名稱-如某某網站),用戶肆意授權後,通過此客戶訪問資源權限並攜帶微信提供的授權碼回到 網站上,我們在用這個授權碼令牌去驗證。

令牌用於檢索授權信息的標識,通過自定義的一些可驗證的方式、算法檢索授權信息,可包含授權信息、證書信息,如果不符合相關要求,急需要客戶端提供一個有效的令牌。

IdentityServer3中提供了相關的接口註入方式

 factory.CustomTokenValidator = new Registration<ICustomTokenValidator, CustomTokenValidator>();
 public class CustomTokenValidator : ICustomTokenValidator
    {

        public async Task<TokenValidationResult> ValidateAccessTokenAsync(TokenValidationResult result)
        {
           
            return await Task.FromResult(result);
        }

        public async Task<TokenValidationResult> ValidateIdentityTokenAsync(TokenValidationResult result)
        {
      
            return await Task.FromResult(result);
        }
    }

接口實現中 ,在這個接口中看下 TokenValidationResult 這個類

public class TokenValidationResult : ValidationResult
    {
        public TokenValidationResult();

        //
        // 摘要:
        //     Gets or sets the claims.
        public IEnumerable<Claim> Claims { get; set; }
        //
        // 摘要:
        //     Gets or sets the client.
        public Client Client { get; set; }
        //
        // 摘要:
        //     Gets or sets the JWT.
        public string Jwt { get; set; }
        //
        // 摘要:
        //     Gets or sets the reference token.
        public Token ReferenceToken { get; set; }
        //
        // 摘要:
        //     Gets or sets the reference token identifier.
        public string ReferenceTokenId { get; set; }
    }

ValidateAccessTokenAsync這個驗證方法 是驗證Token, 這裏包含了Client信息,Claim信息 還有 Jwt (Json Web Token)Token的信息 以及 ReferenceToken 引用相關的信息

ValidateIdentityTokenAsync 登出的時候會調用這個方法,在可以做處理比如清除相關Jwt ReferenceToken

一步一步學習IdentityServer3 (13) 令牌