OAuth承载访问令牌滑动到期

Eug*_*kov 5 c# asp.net oauth bearer-token

我们假设我们使用OAuth承载令牌来保护我们的API.有一个带有OWIN中间件的NuGet包可以为我们做这些:https://www.nuget.org/packages/Microsoft.Owin.Security.OAuth .

Everethig看起来很棒,直到提出有关访问令牌到期的问题 - 我们不想强制使用重复登录一遍又一遍.据我了解,有三种基本方法:

  1. 使访问令牌到期时间非常大(例如1个月)
  2. 使用OAuth刷新令牌会给身份验证服务器和用户应用程序代码带来很多困难(请参阅以下文章http://bitoftech.net/2014/07/16/enable-oauth-refresh-tokens-angularjs-app-using- asp-net-web-api-2-owin /)

我很好奇是否有可能创建一个端点,该端点需要即将到期的访问令牌,只需使用新的访问令牌来模拟OAuth访问令牌的滑动过期类型?

Eug*_*kov 1

警告!如果您不能100% 确定您的应用程序保证(这是不可能的)访问令牌不会被泄露(例如,XSS 漏洞允许窃取访问令牌),那么任何人都不应该使用以下解决方案。在此解决方案中,一旦访问令牌泄漏,它可以用于无限期地延长访问时间。OAuth 刷新令牌恰好解决了这个问题,在访问令牌被破坏的情况下,可以在很短的时间内(通常大约 15 分钟)限制访问。

[Authorize]
public class RefreshTokenController : ApiController
{
    [HttpGet]
    public HttpResponseMessage ReissueToken()
    {
        // just use old identity
        var identity = ((ClaimsPrincipal)User).Identity as ClaimsIdentity;

        var ticket = new AuthenticationTicket(identity, new AuthenticationProperties());
        DateTimeOffset currentUtc = new SystemClock().UtcNow;

        ticket.Properties.IssuedUtc = currentUtc;
        ticket.Properties.ExpiresUtc = currentUtc.AddMinutes(30);

        string token = Startup.OAuthBearerAuthOptions.AccessTokenFormat.Protect(ticket);

        return new HttpResponseMessage(HttpStatusCode.OK)
        {
            Content = new ObjectContent<object>(new
            {
                accessToken = token,
                expiresIn = (int)((ticket.Properties.ExpiresUtc.Value - ticket.Properties.IssuedUtc.Value).TotalSeconds),
            }, Configuration.Formatters.JsonFormatter)
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果攻击者掌握了访问令牌,他们就可以通过不断重新颁发受损的访问令牌来无限期地保持访问权限。这就是刷新令牌试图解决的问题。如果您选择此路线,请务必将访问令牌存储在数据库中并添加必要的代码检查,以便在受到威胁时可以撤销它们。 (3认同)