【发布时间】:2015-02-06 07:22:14
【问题描述】:
我正在使用声明身份验证使用 ASP.NET WebApi 2 构建一个 Web api,我的用户可以拥有大量声明。由于有大量声明,不记名令牌会迅速增长,因此我正在尝试找到一种方法来返回更短的不记名令牌。
到目前为止,我发现我可以为 OAuth 选项 OAuthAuthorizationServerOptions.AccessTokenProvider 属性提供 IAuthenticationTokenProvider:
OAuthOptions = new OAuthAuthorizationServerOptions
{
TokenEndpointPath = new PathString("/Token"),
Provider = new ApplicationOAuthProvider(PublicClientId),
AccessTokenExpireTimeSpan = TimeSpan.FromHours(12),
AccessTokenProvider = new GuidProvider() // <-- here
};
这让我有机会拦截 AuthenticationTicket 并将其隐藏起来,用更简单的东西代替它 - 在我下面的哈希 guid 示例中。 (注意:目前这个类只是在我的会话中保存一个ConcurrentDictionary<string,AuthenticationTicket> - 在一个真实的示例中,我打算将会话存储在一些持久性存储中)
public class GuidProvider : IAuthenticationTokenProvider
{
private static ConcurrentDictionary<string, AuthenticationTicket> tokens
= new ConcurrentDictionary<string, AuthenticationTicket>();
public void Create(AuthenticationTokenCreateContext context)
{
throw new NotImplementedException();
}
public async System.Threading.Tasks.Task CreateAsync(AuthenticationTokenCreateContext context)
{
var guid = Guid.NewGuid().ToString();
var ticket = Crypto.Hash(guid);
tokens.TryAdd(ticket, context.Ticket);
context.SetToken(ticket);
}
public void Receive(AuthenticationTokenReceiveContext context)
{
throw new NotImplementedException();
}
public async System.Threading.Tasks.Task ReceiveAsync(AuthenticationTokenReceiveContext context)
{
AuthenticationTicket ticket;
if (tokens.TryGetValue(context.Token, out ticket))
{
if (ticket.Properties.ExpiresUtc.Value < DateTime.UtcNow)
{
tokens.TryRemove(context.Token, out ticket);
}
context.SetTicket(ticket);
}
}
}
所以我的问题:
- 这是提供代理密钥来代替我的长声明生成令牌的适当(且安全!)方式吗?
- 我应该在 webapi/OAuth 堆栈中执行此操作的地方是否可能更好/更容易?
要注意的另一件事是我打算支持刷新令牌,实际上上面的示例是从使用这种机制的示例中提取的刷新令牌-除了刷新令牌它们似乎是一次性使用的,所以ReceiveAsync 方法通常会删除ConcurrentDictionary 提供的刷新令牌,我不完全确定我理解为什么?
【问题讨论】:
-
-
因为授权可以与客户端应用程序隔离,您无法从代理令牌推断出声明。
-
@jamiec 我使用 JWT 的回答是否帮助您缩短了充满声明的访问令牌?
-
@TaiseerJoudeh - 有也没有。虽然它没有直接回答我的问题,但它给了我一个新的探索途径,我几乎没有遇到过。感谢您的回答,我希望此时可以接受一半的赏金。我可能会考虑在新的一年里对这个问题进行奖励。
标签: c# asp.net-web-api oauth bearer-token