Fork me on GitHub

一步一步学习IdentityServer3 (13) 令牌

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

posted @ 2017-11-16 17:17  龙码精神  阅读(1007)  评论(0编辑  收藏  举报