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
例子可以参看 这里.