クレーム認証を使用して ASP.NET WebApi 2 を使用して Web API を構築していますが、ユーザーは非常に多くのクレームを持つことができます。多数のクレームがあると、ベアラー トークンが急速に大きくなるため、はるかに短いベアラー トークンを返す方法を見つけようとしています。
IAuthenticationTokenProvider
これまでのところ、OAuth オプションOAuthAuthorizationServerOptions.AccessTokenProvider
プロパティに を提供できることを発見しました。
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 スタック内でこれを行う必要がある、より良い/より簡単な場所はありますか?
注意すべきもう 1 つのことは、リフレッシュ トークンをサポートするつもりであるということです。実際、上記の例は、リフレッシュ トークンにこの種のメカニズムを使用する例から引き出されたものです ReceiveAsync
。通常、 から提供されたリフレッシュ トークンは常に削除されますが、そのConcurrentDictionary
理由がよくわかりません。