C# 缩短ASP.NET WebAPI 2中OWIN返回的访问令牌

C# 缩短ASP.NET WebAPI 2中OWIN返回的访问令牌,c#,asp.net-web-api2,asp.net-identity,owin,C#,Asp.net Web Api2,Asp.net Identity,Owin,我们使用ASP.NETWebAPI 2开发了一个RESTAPI,并使用ASP.NETIdentity保护它。客户端要求将其令牌设置为较长的过期时间,因为它们将访问令牌存储在数据库中 在测试期间,他们要求我们减少令牌的长度,因为他们的数据库只能处理多达250个字符的字符串。我们的实现相当“普通”。以下是我们当前为承载令牌设置的选项: OAuthOptions = new OAuthAuthorizationServerOptions { TokenEndpointPath = new Pa

我们使用ASP.NETWebAPI 2开发了一个RESTAPI,并使用ASP.NETIdentity保护它。客户端要求将其令牌设置为较长的过期时间,因为它们将访问令牌存储在数据库中

在测试期间,他们要求我们减少令牌的长度,因为他们的数据库只能处理多达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个字符的限制?我注意到一些与设置自定义访问令牌格式化程序等相关的属性,但不确定如何实现这些属性&限制和/或陷阱是什么


任何帮助都将不胜感激。

我将首先将令牌中包含的索赔数量降至最低

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

运行一些测试,看看您的本地最大值是多少,然后添加10%。

答案是肯定的

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

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

下面是示例代码,核心是重写OAuthAuthorizationServerOptions类的OnCreate/OnReceive方法。 您可能还希望覆盖onCreate AsyncOnReceiveAsync

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

答案应该是否定的。我们有安全标准,我们不能把它们置于危险之中。。。