【问题标题】:Why GrantRefreshToken method is not called - Oauth2 ASP.NET Web API为什么不调用 GrantRefreshToken 方法 - Oauth2 ASP.NET Web API
【发布时间】:2020-02-11 20:03:05
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    这两天我一直面临同样的问题。

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

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

    生成工单的最低要求是设置 IssuedUtcExpiresUtc 并将其他属性保留为默认值。

    下面的代码可以简单地复制问题。

    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;
        }
    

    一旦设置了 IssuedUtcExpiresUtcGrantRefreshToken 将 调用。

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

    【讨论】:

      【解决方案2】:

      ReceiveAsync 签名应该是:public Task ReceiveAsync(AuthenticationTokenReceiveContext context)

      你应该在那个方法中返回一个任务。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2021-09-02
          • 2013-06-04
          • 1970-01-01
          • 2016-04-27
          • 1970-01-01
          • 1970-01-01
          • 2015-06-04
          • 2013-09-24
          • 2013-05-31
          相关资源
          最近更新 更多