花了一些时间解决这个问题后,我决定寻求帮助-也许有人知道我在哪里做错了。
首先,我有一个配置有BearerAuthentication的ASP.NET WebAPI(.NET 4.7.2)项目:
OAuthOptions = new OAuthAuthorizationServerOptions
{
TokenEndpointPath = new PathString("/Token"),
Provider = new CustomerOAuthProvider(PublicClientId),
AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(30),
RefreshTokenProvider = new AuthenticationTokenProvider()
{
OnCreate = (obj) =>
{
obj.Ticket.Properties.ExpiresUtc = DateTime.UtcNow.AddMonths(6);
obj.SetToken(obj.SerializeTicket());
},
OnReceive = (obj) => { obj.DeserializeTicket(obj.Token); }
},
};
一切正常,除了刷新令牌流;流程是这样的:
1)发出一个简短的过期身份验证令牌和一个刷新令牌:使用用户名,密码和grant_type: 'password'
向/ token发出POST请求;响应返回的非常好:
{
"access_token": "UN8tE3iJWlIjGX1eTbOEc2nX7qaZ2ACvor...",
"token_type": "bearer",
"expires_in": 1799,
"refresh_token": "fb84E_OqK334Z1t00WrOAm6phYTA63dLye96eE8NF4NV...",
"userName": "XXXX",
".issued": "Sat, 06 Apr 2019 21:14:39 GMT",
".expires": "Sat, 06 Apr 2019 21:44:39 GMT"
}
2)将刷新令牌换成更长的身份验证令牌:使用'grant_type': 'refresh_token'
和'refresh_token':'fb84E_OqK334Z1t00WrOAm6phYTA63dLye96eE8NF4NV...'
向同一端点/ token发出POST请求,并感到惊讶-我回来的响应有同样的有效期:
{
"access_token": "EwOXPrGOzV9nU_...",
"token_type": "bearer",
"expires_in": 1799,
"refresh_token": "gsPVze9u2auwMZXspFY...",
"userName": "XXX",
".issued": "Sat, 06 Apr 2019 21:20:11 GMT",
".expires": "Sat, 06 Apr 2019 21:50:11 GMT"
}
我想强调一点,我也尝试过使用自定义AuthenticationTokenProvider
实现,但还是没有运气。
在进行一些调试时(现在我也在谈论我的AuthenticationTokenProvider的自定义实现),我观察到的是,到处到期时间都是正确的,并且context.Ticket.Properties.Dictionary
始终具有正确的值,除了一个地方(来自我OAuthAuthorizationServerProvider
的自定义实现):
public override Task TokenEndpoint(OAuthTokenEndpointContext context)
{
foreach (KeyValuePair<string, string> property in context.Properties.Dictionary)
{
context.AdditionalResponseParameters.Add(property.Key, property.Value);
}
return Task.FromResult<object>(null);
}
此处,到期时间是结果JSON中显示的时间。你有什么想法吗
所有nuget软件包均为最新版本。
谢谢。