我向请求正文的oauth2服务器发送请求:
grant_type=refresh_token&refresh_token=abc
我在数据库中保存了refresh_token。
ReceiveAsync方法:
public async Task ReceiveAsync(AuthenticationTokenReceiveContext context)
{
var allowedOrigin = context.OwinContext.Get<string>("clientAllowedOrigin");
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { allowedOrigin });
string hashTokenName = Helper.GetHash(context.Token);
var refreshToken = await repo.FindRefreshToken(hashTokenName);
if (refreshToken != null)
{
//Get protectedTicket from refreshToken class
context.DeserializeTicket(refreshToken.ProtectedTicket);
var result = await repo.RemoveRefreshToken(hashTokenName);
}
}
GrantRefreshToken方法:
public override Task GrantRefreshToken(OAuthGrantRefreshTokenContext context)
{
var originClient = context.Ticket.Properties.Dictionary["client_id"];
var currenClient = context.ClientId;
if (originClient != currenClient)
{
context.SetError("Error");
return Task.FromResult<object>(null);
}
var newIdentity = new ClaimsIdentity(context.Ticket.Identity);
newIdentity.AddClaim(new Claim(ClaimTypes.Name, context.ClientId));
var newTicket = new AuthenticationTicket(newIdentity, context.Ticket.Properties);
context.Validated(newTicket);
return Task.FromResult<object>(null);
}
为什么在ReceiveAsync结束时不调用GrantRefreshToken?
答案 0 :(得分:2)
我遇到同样的问题已经两天了。
ReceiveAsync 方法导致的问题未设置 OAuthGrantRefreshTokenContext context.ticket 正确。
要进行诊断,请使用邮递员发送refresh_token请求。将会提示 invalid_grant 错误。
生成票证的最低要求是设置 IssuedUtc 和 ExpiresUtc ,并将其他属性保留为默认值。
下面的代码可以简单地复制问题。
public async Task ReceiveAsync(AuthenticationTokenReceiveContext context)
{
AuthenticationTicket ticket = null;
var identity = new ClaimsIdentity();
var props = new AuthenticationProperties();
ticket = new AuthenticationTicket(identity, props);
context.SetTicket(ticket);
//context.Ticket.Properties.IssuedUtc = DateTime.UtcNow;
//context.Ticket.Properties.ExpiresUtc = DateTime.UtcNow;
}
一旦设置 IssuedUtc 和 ExpiresUtc ,将设置 GrantRefreshToken 调用。
解决方案:在ReceiveAsync方法的末尾放置一个断点,检查 是否正确设置了context.ticket。 IssuedUtc和ExpiresUtc这两个属性不能为null。
答案 1 :(得分:0)
ReceiveAsync签名应为:公共任务ReceiveAsync(AuthenticationTokenReceiveContext上下文)
您应该使用该方法返回一个任务。
答案 2 :(得分:0)
我遇到了完全相同的问题,在我的情况下,根本原因是机器密钥,引擎使用机器密钥序列化了票证,因此,如果您未在Web中配置machine key .config,则可以在序列化过程中使用一个密钥,在反序列化过程中使用另一个密钥。 因此,尝试在web.cofig中配置机器密钥。希望这会有所帮助