클레임 인증을 사용하여 ASP.NET WebApi 2를 사용하여 웹 API를 작성 중이며 사용자가 매우 많은 클레임을 가질 수 있습니다. 클레임 수가 많으면 무기명 토큰이 빠르게 커지므로 훨씬 짧은 무기 토큰을 반환하는 방법을 찾으려고합니다.대리 토큰을 제공하여 webapi에서 긴 무기명 토큰을 처리합니다.
는 지금까지 내가 OAuth를 옵션에 IAuthenticationTokenProvider
에게 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 스택에서이 작업을 수행해야하는 더 좋고/더 쉬운 곳이 있을까요? 새로 고침 토큰을 제외하고는 그들이 한 것으로 보인다 -
주목해야 할 또 다른 것은 내가 새로 고침 토큰을 지원하고자, 사실의 예는 위의 새로 고침 토큰 메커니즘 이런 종류의 사용 예에서 당겨졌다이다 -use, 따라서 ReceiveAsync
메서드는 대개 항상 ConcurrentDictionary
에서 제공되는 새로 고침 토큰을 제거하므로 완전히 이해할 수없는 이유는 무엇입니까?
클라이언트가이 권한을 다시 보내면이 접근 방법이 좋을 것입니다. 액세스 토큰을 처리 할 때 액세스 토큰을 처리하려면 액세스 토큰을 다시 가져 오십시오. 액세스 토큰을 처리하려면 OAuth2가 제트 될 것입니다. 올바른 선택이되지 않습니다. – Saravanan
권한을 격리 할 수 있기 때문에 클라이언트 응용 프로그램 및 대리 토큰에서 클레임을 유추 할 수 없습니다. – Saravanan
@ jamiec JWT를 사용하여 저의 답이 클레임으로 가득 찬 액세스 토큰을 줄이는 데 도움이 되었습니까? –