使用PoP令牌


layout: docs-default

在katana管道中使用PoP令牌

在WebApi中使用PoP令牌,需要两部分配置。
第一部分是配置令牌验证中间件,有些小的修改来适应PoP令牌校检。
第二部分是配置中间件通过验证PoP令牌中的签名来确认拥有证据(PoP)的密钥

IdentityModel.Owin.PopAuthentication NuGet 包提供了基本代码来完成这个配置

修改正常的令牌验证中间件

主要有两个配置改变来适应PoP令牌。一个是修改认证schema为PoP,然后配置令牌提供器定位PoP令牌中的访问令牌。
配置认证中间件使用PoP Schema很简单,只需要把AuthenticationType 属性设置为 "PoP" (注意两个P都是大写的).

配置令牌提供器从PoP令牌中拿到访问令牌,需要设置Provider属性,并且处理OnRequestToken事件。
DefaultPopTokenProvider.GetAccessTokenFromPopTokenAsync 帮助方法可以来完成这个工作。

如果使用 IdentityServer3.AccessTokenValidation 中间件,那么配置修改后,看起来和下面一样:

public void Configuration(IAppBuilder app)
{
    JwtSecurityTokenHandler.InboundClaimTypeMap.Clear();

    app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
    {
        // The HttpSignatureValidation middleware looks for another middleware called PoP
        AuthenticationType = "PoP",
        
        // locate the access token from within  the PoP token
        Provider = new OAuthBearerAuthenticationProvider
        {
            OnRequestToken = async ctx =>
            {
                ctx.Token = await DefaultPopTokenProvider.GetAccessTokenFromPopTokenAsync(ctx.OwinContext.Environment);
            }
        },
        
        // ...
    };
}

如果使用 Microsoft.Owin.Security.Jwt 中间件,配置之后看起来和下面一样:

public void Configuration(IAppBuilder app)
{
    JwtSecurityTokenHandler.InboundClaimTypeMap.Clear();

    app.UseJwtBearerAuthentication(new JwtBearerAuthenticationOptions
    {
        // The HttpSignatureValidation middleware looks for another middleware called PoP
        AuthenticationType = "PoP",
        
        // locate the access token from within  the PoP token
        Provider = new OAuthBearerAuthenticationProvider
        {
            OnRequestToken = async ctx =>
            {
                ctx.Token = await DefaultPopTokenProvider.GetAccessTokenFromPopTokenAsync(ctx.OwinContext.Environment);
            }
        },  
              
        // ...
    };
}

中间件验证使用PoP来HTTP请求

一旦上面的代码从PoP令牌中取到了访问令牌,那么必须用PoP令牌中的签名来验证当前HTTP请求。
只要在访问令牌验证中间件之后 注册HttpSignatureValidationMiddleware 到Katana 管道里,就可以实现上面的验证过程。
看起来如下:

public void Configuration(IAppBuilder app)
{
    JwtSecurityTokenHandler.InboundClaimTypeMap.Clear();

    app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
    {
        // The HttpSignatureValidation middleware looks for another middleware called PoP
        AuthenticationType = "PoP",
        
        // locate the access token from within  the PoP token
        Provider = new OAuthBearerAuthenticationProvider
        {
            OnRequestToken = async ctx =>
            {
                ctx.Token = await DefaultPopTokenProvider.GetAccessTokenFromPopTokenAsync(ctx.OwinContext.Environment);
            }
        },
        
        // ...
    };
    
    app.UseHttpSignatureValidation();
}

默认的签名验证使用收到的访问令牌和PoP令牌里的时间戳,如果使用签名验证HTTP请求的其它部分,那么可以把HttpSignatureValidationOptions传到UseHttpSignatureValidation API.

HttpSignatureValidationOptions 包含下面的配置项:

  • TimespanValidityWindow: TimeSpan 使用PoP令牌中的 Timespan 来验证;
  • ValidateMethod: 验证the HTTP request's 方法.
  • ValidateHost: 验证 the HTTP request's 主机名.
  • ValidatePath: 验证 the HTTP request's 路径.
  • ValidateBody: 验证 the HTTP request's 主体.
  • QueryParametersToValidate: 一个集合指定querystring的键值来验证HTTP request.
  • RequestHeadersToValidate: 一个结合指定Http头的键值来验证HTTP request

例子可以参看 这里.

你可能感兴趣的:(使用PoP令牌)