为什么不调用GrantRefreshToken方法--Oauth2 ASP.NET Web API

时间:2017-07-20 08:29:06

标签: asp.net-web-api oauth oauth-2.0

我向请求正文的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?

3 个答案:

答案 0 :(得分:2)

我遇到同样的问题已经两天了。

ReceiveAsync 方法导致的问题未设置 OAuthGrantRefreshTokenContext context.ticket 正确。

要进行诊断,请使用邮递员发送refresh_token请求。将会提示 invalid_grant 错误。 postman screenshot

生成票证的最低要求是设置 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;
    }

code result screen shot

一旦设置 IssuedUtc ExpiresUtc ,将设置 GrantRefreshToken 调用。

enter image description here

解决方案:在ReceiveAsync方法的末尾放置一个断点,检查 是否正确设置了context.ticket。 IssuedUtc和ExpiresUtc这两个属性不能为null。

答案 1 :(得分:0)

ReceiveAsync签名应为:公共任务ReceiveAsync(AuthenticationTokenReceiveContext上下文)

您应该使用该方法返回一个任务。

答案 2 :(得分:0)

我遇到了完全相同的问题,在我的情况下,根本原因是机器密钥,引擎使用机器密钥序列化了票证,因此,如果您未在Web中配置machine key .config,则可以在序列化过程中使用一个密钥,在反序列化过程中使用另一个密钥。 因此,尝试在web.cofig中配置机器密钥。希望这会有所帮助