5

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

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

  1. 使 Access Token 过期时间非常长(例如 1 个月)
  2. 使用 OAuth Refresh Tokens 会给 Authentication Server 和用户应用程序代码增加很多困难(在以下文章http://bitoftech.net/2014/07/16/enable-oauth-refresh-tokens-angularjs-app-using-中进行了描述) asp-net-web-api-2-owin/ )

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

4

1 回答 1

1

警告!如果您不能 100% 确定您的应用程序保证(这是不可能的)访问令牌不能被组合(例如,XSS 漏洞允许窃取访问令牌),那么这是任何人都不应使用的解决方案。在此解决方案中,一旦访问令牌泄露,它可用于无限期延长访问权限。OAuth Refresh Tokens 正好解决了这个问题,在很短的时间内(通常是 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)
        };
    }
}
于 2015-04-09T20:38:30.310 回答