OWIN de Sécurité - Comment mettre en place OAuth2 Actualisation des Jetons
Je suis à l'aide de l'Api du Web 2 modèle est livré avec Visual Studio 2013 a quelques OWIN middleware pour faire de l'Authentification de l'Utilisateur et les goûts de.
Dans le OAuthAuthorizationServerOptions
j'ai remarqué que le OAuth2 Serveur est configuré pour distribuer les jetons qui expire dans 14 jours
OAuthOptions = new OAuthAuthorizationServerOptions
{
TokenEndpointPath = new PathString("/api/token"),
Provider = new ApplicationOAuthProvider(PublicClientId,UserManagerFactory) ,
AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
AllowInsecureHttp = true
};
Ce n'est pas adapté pour mon dernier projet. Je tiens à main de courte durée bearer_tokens qui peuvent être actualisées à l'aide d'un refresh_token
J'ai fait beaucoup de recherches sur google et ne peut pas trouver quelque chose d'utile.
Donc, c'est comment à présent, j'ai réussi à obtenir. J'ai maintenant atteint le point de "WTF dois-je maintenant".
J'ai écrit un RefreshTokenProvider
qui implémente IAuthenticationTokenProvider
que par la RefreshTokenProvider
bien sur OAuthAuthorizationServerOptions
classe:
public class SimpleRefreshTokenProvider : IAuthenticationTokenProvider
{
private static ConcurrentDictionary<string, AuthenticationTicket> _refreshTokens = new ConcurrentDictionary<string, AuthenticationTicket>();
public async Task CreateAsync(AuthenticationTokenCreateContext context)
{
var guid = Guid.NewGuid().ToString();
_refreshTokens.TryAdd(guid, context.Ticket);
//hash??
context.SetToken(guid);
}
public async Task ReceiveAsync(AuthenticationTokenReceiveContext context)
{
AuthenticationTicket ticket;
if (_refreshTokens.TryRemove(context.Token, out ticket))
{
context.SetTicket(ticket);
}
}
public void Create(AuthenticationTokenCreateContext context)
{
throw new NotImplementedException();
}
public void Receive(AuthenticationTokenReceiveContext context)
{
throw new NotImplementedException();
}
}
//Now in my Startup.Auth.cs
OAuthOptions = new OAuthAuthorizationServerOptions
{
TokenEndpointPath = new PathString("/api/token"),
Provider = new ApplicationOAuthProvider(PublicClientId,UserManagerFactory) ,
AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(2),
AllowInsecureHttp = true,
RefreshTokenProvider = new RefreshTokenProvider() //This is my test
};
Alors maintenant, quand quelqu'un demande une bearer_token
je suis maintenant en envoyant un refresh_token
, ce qui est excellent.
Alors maintenant, comment puis-je utilise cette refresh_token pour obtenir une nouvelle bearer_token
, sans doute j'ai besoin d'envoyer une demande à mon jeton de point de terminaison de certains en-Têtes HTTP ensemble?
Il suffit de penser à haute voix que je tape... dois-je les traiter refresh_token expiration dans mon SimpleRefreshTokenProvider
? Comment un client d'obtenir un nouveau refresh_token
?
Que je pouvais vraiment faire avec certains matériels de lecture et de documentation, parce que je ne veux pas de se tromper et souhaitez suivre une sorte de standard.
- Il y a un bon tutoriel sur la mise en œuvre de l'actualisation des jetons à l'aide de Owin et OAuth: bitoftech.net/2014/07/16/...
Vous devez vous connecter pour publier un commentaire.
Juste à mes OWIN Service Porteur (appelé access_token dans la suite) et d'Actualisation des Jetons. Mon aperçu de cette est que vous pouvez utiliser différents flux. Donc, cela dépend de la circulation que vous souhaitez utiliser comment vous définissez votre access_token et refresh_token temps d'expiration.
Je vais vous décrire deux flux Un et B dans les suivantes (je suggère ce que vous voulez est le flux de B):
A) heure d'expiration de l'access_token et refresh_token sont les mêmes que c'est par défaut 1200 secondes ou 20 minutes. Ce flux a besoin de votre client premier à envoyer client_id et client_secret avec les données de connexion pour obtenir une access_token, refresh_token et expiration_time. Avec le refresh_token il est maintenant possible d'obtenir un nouveau access_token pendant 20 minutes (ou ce que vous définissez la AccessTokenExpireTimeSpan dans le OAuthAuthorizationServerOptions pour). Pour la raison que le temps d'expiration de l'access_token et refresh_token sont les mêmes, votre client est responsable pour obtenir un nouveau access_token avant l'expiration du temps! E. g. votre client peut envoyer une actualisation de POSTE de l'appel à votre jeton d'extrémité avec le corps (remarque: vous devez utiliser le protocole https en production)
pour obtenir un nouveau jeton par exemple, après 19 minutes pour éviter que les jetons à partir de l'expiration.
B) dans ce flux vous voulez avoir un effet à court terme de l'expiration de votre access_token et une longue durée d'expiration de votre refresh_token. Supposons à des fins de test, vous définissez l'access_token à échéance dans 10 secondes (
AccessTokenExpireTimeSpan = TimeSpan.FromSeconds(10)
) et le refresh_token à 5 Minutes. Maintenant vient la partie la plus intéressante du réglage de l'heure d'expiration de l'refresh_token: Vous faire dans votre createAsync fonction dans SimpleRefreshTokenProvider classe comme ceci:Maintenant votre client est en mesure d'envoyer un appel POST avec un refresh_token à votre jeton de point de terminaison lorsque le
access_token
est expiré. La partie du corps de l'appel peut ressembler à ceci:grant_type=refresh_token&client_id=xxxxxx&refresh_token=xxxxxxxx-xxxx-xxxx-xxxx-xx
Une chose importante est que vous pouvez utiliser ce code, non seulement dans vos CreateAsync fonction mais aussi dans la création de la fonction. Donc, vous devriez envisager d'utiliser votre propre fonction (par exemple appelé CreateTokenInternal) pour le code ci-dessus.
Ici vous pouvez trouver les implémentations des différents flux, y compris refresh_token flux(mais sans définir le délai d'expiration de la refresh_token)
Voici un exemple de mise en œuvre de IAuthenticationTokenProvider sur github (avec réglage de la date d'expiration de l'refresh_token)
Je suis désolé que je ne peux pas vous aider avec d'autres matériaux que le protocole OAuth les Spécifications et la Documentation de l'API de Microsoft. Je voudrais poster les liens ici, mais ma réputation ne me permet pas de poster plus de 2 liens....
J'espère que cela peut aider certains autres pour gagner du temps lors de la tentative de mettre en œuvre OAuth2.0 avec refresh_token temps d'expiration différente de access_token temps d'expiration. Je ne pouvais pas trouver un exemple de mise en œuvre sur le web (à l'exception de celui de thinktecture lien ci-dessus) et il m'a fallu quelques heures de l'enquête jusqu'à ce qu'il a travaillé pour moi.
Nouvelle info: Dans mon cas, j'ai deux possibilités différentes pour recevoir des jetons. On est à un access_token. Là, j'ai envoyer un appel POST avec un ensemble de Cordes en format application/x-www-form-urlencoded avec les données suivantes
Seconde est si access_token n'est plus valide, nous pouvons tenter de le refresh_token par l'envoi d'un POSTE téléphonique avec un ensemble de Cordes en format
application/x-www-form-urlencoded
avec les données suivantesgrant_type=refresh_token&client_id=YOURCLIENTID&refresh_token=YOURREFRESHTOKENGUID
RefreshTokens
, donc siRefreshTokens
est une fuite, un attaquant ne peut pas utiliser cette information!?Vous avez besoin pour mettre en œuvre RefreshTokenProvider.
D'abord créer une classe pour RefreshTokenProvider ie.
Puis ajouter une instance de OAuthOptions.
context.OwinContext.Environment
contient unMicrosoft.Owin.Form#collection
clé qui vous donne unFormCollection
où vous pouvez trouver le type de subvention et d'ajouter un jeton en conséquence. C'est la fuite de la mise en œuvre, il peut se casser à tout moment avec les futures mises à jour, et je suis pas sur si c'est portable entre OWIN hôtes.var form = await context.Request.ReadFormAsync();
var grantType = form.GetValue("grant_type");
puis le problème de l'actualisation jeton si la subvention n'est pas de type "refresh_token"Je ne pense pas que vous devriez être en utilisant un tableau de maintenir les jetons. Ni vous besoin d'un guid comme un jeton.
Vous pouvez facilement utiliser le contexte.SerializeTicket().
Voir mon code ci-dessous.
La réponse de Freddy m'a beaucoup aidé à obtenir ce travail. Par souci d'exhaustivité, voici comment vous pouvez mettre en œuvre le hachage du jeton:
Dans
CreateAsync
:ReceiveAsync
: