Я создаю веб-api, используя ASP.NET WebApi 2, используя аутентификацию с претензиями, и мои пользователи могут иметь очень большое количество претензий. При большом количестве претензий токен-носитель быстро растет очень быстро, поэтому я пытаюсь найти способ вернуть гораздо более короткий токен-носитель.Работа с длинными токенами-носителями из webapi путем предоставления суррогатного токена
До сих пор я обнаружил, что я могу предоставить IAuthenticationTokenProvider
к опциям OAuth OAuthAuthorizationServerOptions.AccessTokenProvider
недвижимость:
OAuthOptions = new OAuthAuthorizationServerOptions
{
TokenEndpointPath = new PathString("/Token"),
Provider = new ApplicationOAuthProvider(PublicClientId),
AccessTokenExpireTimeSpan = TimeSpan.FromHours(12),
AccessTokenProvider = new GuidProvider() // <-- here
};
И это дает мне шанс перехватить AuthenticationTicket
и спрятать его подальше, заменив его чем-то более простым - в моем примере ниже хэшированного руководства. (Примечание: На данный момент этот класс просто держит 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?
Другого дело, следует отметить, что я намерен поддерживать токены обновления, а на самом деле выше пример был разобран из примеров, которые используют этот вид механизма маркеров Refresh - за исключением маркеров обновления они кажутся одного -use, поэтому метод ReceiveAsync
обычно всегда удаляет токен обновления, поставляемый с ConcurrentDictionary
, я не совсем уверен, что понимаю почему?
Этот подход прекрасен, если ваш клиент повторно отправит это разрешение, чтобы вернуть токен доступа, если вы используете его, чтобы обращаться с токенами доступа, которые в OAuth2 будут самолетом, не будет правильным выбором. – Saravanan
Поскольку авторизация может быть изолирована от клиентское приложение, и вы не можете вывести иск из суррогатного токена. – Saravanan
@jamiec мой ответ, используя JWT, помог вам сократить ваш токен доступа, полный претензий? –