【问题标题】:Shorten access token returned by OWIN in ASP.NET WebAPI 2缩短 OWIN 在 ASP.NET WebAPI 2 中返回的访问令牌
【发布时间】:2015-12-03 13:33:50
【问题描述】:

我们使用 ASP.NET WebAPI 2 开发了一个 REST API,并使用 ASP.NET Identity 对其进行保护。客户要求将他们的令牌设置为较长的​​过期时间,因为他们将访问令牌存储在他们的数据库中。

在测试期间,他们要求我们减少令牌的长度,因为他们的数据库最多只能处理 250 个字符的字符串。我们的实现非常“香草”。以下是我们当前为不记名令牌设置的选项:

OAuthOptions = new OAuthAuthorizationServerOptions {
    TokenEndpointPath = new PathString("/oauth/2/token"),
    Provider = new ApplicationOAuth2Provider(PublicClientId),
    AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
    AccessTokenExpireTimeSpan = TimeSpan.FromDays(1000000),
    AllowInsecureHttp = true
};

我们将如何将令牌缩短到 250 个字符的限制?我注意到一些与设置自定义访问令牌格式化程序等相关的属性,但不确定如何实现这些以及限制和/或陷阱是什么。

任何帮助将不胜感激。

【问题讨论】:

  • 答案应该是否定的。我们有安全标准,我们不能让这些标准处于危险之中......

标签: c# asp.net-web-api2 asp.net-identity owin


【解决方案1】:

答案是肯定的。

由于客户端只是将相同的令牌字符串发送回服务器,因此您可以发送令牌的哈希值。

我所做的是使用 GUID 来表示令牌,它只有 32 个字符。 并将映射信息(GUID => token)存储在服务器端。 当用户尝试通过 GUID 进行身份验证时,您可以从存储它的位置读取 REAL 令牌,然后反序列化票证。

这里是示例代码,核心是重写OAuthAuthorizationServerOptions类的OnCreate/OnReceive方法。 您可能还想覆盖 OnCreateAsyncOnReceiveAsync

OAuthOptions = new OAuthAuthorizationServerOptions
{
    TokenEndpointPath = new PathString("/Token"),
    Provider = new ApplicationOAuthProvider(PublicClientId),
    AccessTokenProvider = new AuthenticationTokenProvider
    {
        OnCreate = (context) =>
        {
            var token = context.SerializeTicket();
            var guid = Guid.NewGuid().ToString("N");
            // You need to implement your own logical here, for example, store the mapping (guid => token) into database
            RedisServer.SetValue(guid, token, TimeSpan.FromDays(Consts.AccessTokenExpireDays)); 
            context.SetToken(guid);
        },
        OnReceive = (context) =>
        {
            var token = RedisServer.GetValue(context.Token);
            context.DeserializeTicket(token);
        }
    },
    AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
    AccessTokenExpireTimeSpan = TimeSpan.FromDays(Consts.AccessTokenExpireDays),
    // In production mode set AllowInsecureHttp = false
    AllowInsecureHttp = true,
};

【讨论】:

    【解决方案2】:

    我会首先将令牌中包含的声明数量减少到最低限度。

    而且 250 个字符太短,无法表示任何类型的加密数据结构,例如身份验证令牌。客户端可能会更改为 varbinary,但由于它们会弄乱架构,因此它们也可能会增加大小。

    运行一些测试,看看你的局部最大值是多少,然后增加 10%。

    【讨论】:

      猜你喜欢
      • 2015-07-02
      • 2020-05-19
      • 1970-01-01
      • 2018-11-09
      • 2012-08-25
      • 2023-04-11
      • 2015-01-15
      • 2019-10-07
      • 1970-01-01
      相关资源
      最近更新 更多