[英]Shorten access token returned by OWIN in ASP.NET WebAPI 2
我们使用 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 个字符的限制? 我注意到一些与设置自定义访问令牌格式化程序等相关的属性,但我不确定如何实现这些以及限制和/或陷阱是什么。
任何帮助将不胜感激。
答案是肯定的。
由于客户端只是将相同的令牌字符串发送回服务器,因此您可以发送令牌的哈希值。
我所做的是使用 GUID 来表示令牌,它只有 32 个字符。 并将映射信息(GUID => 令牌)存储在服务器端。 当用户尝试通过 GUID 进行身份验证时,您可以从存储它的位置读取 REAL 令牌,然后反序列化票证。
下面是示例代码,核心是重写OAuthAuthorizationServerOptions类的OnCreate / OnReceive方法。 您可能还想覆盖OnCreateAsync和OnReceiveAsync 。
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,
};
我首先将令牌中包含的声明数量减少到最低限度。
250 个字符太短,无法表示任何类型的加密数据结构,例如身份验证令牌。 客户端可以更改为 varbinary,但由于它们与架构混乱,因此它们也可能会增加大小。
运行一些测试以查看您的本地最大值是多少,然后添加 10%。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.