Comment invalider jeton OAuth lorsque le mot de passe est changé?
Nous utilisons ASP.NET l'Identité dans un projet d'Api Web avec SimpleAuthorizationServerProvider
, nous utilisons le protocole OAuth-des jetons pour autoriser chaque demande du client. (Jetons, et viennent à échéance laps de temps, nous n'utilisons pas d'actualisation des jetons.)
Lorsque les utilisateurs de changer leur mot de passe, je tiens à invalider les jetons qu'ils peuvent avoir, éventuellement sur d'autres appareils. Est-il de toute façon explicitement de le faire? J'ai testé et vu que les jetons de travail sans aucun problème après un changement de mot de passe, ce qui devrait être évité.
J'ai pensé à mettre le hachage de mot de passe, ou d'une partie de la valeur de hachage dans le jeton OAuth comme une revendication, et la validation dans le OnAuthorization
la méthode de notre dérivés AuthorizeAttribute filtre.
Serait-ce une bonne façon de résoudre le problème?
- N'est-ce pas en partie avec OAuth qu'il est indépendant lors de changements de Mot de passe? Pourquoi ne pas simplement supprimer le jeton à partir de votre serveur d'Authentification lorsqu'ils changent le mot de passe puis si ils essaient de l'utiliser sur d'autres périphériques, cela ne marchera pas.
- "Pourquoi ne pas simplement supprimer le jeton à partir de votre serveur d'Authentification": est-ce possible avec ASP.NET l'Identité? Je pensais que les jetons sont autonomes, de sorte qu'ils peuvent être utilisés sur n'importe quel serveur web instance, et donc nous n'avons pas de serveur d'Authentification.
- Si c'est vrai, ça sonne comme si j'avais besoin d'un rappel sur "ASP.NET l'Identité" sa fait un moment. Désolé.
Vous devez vous connecter pour publier un commentaire.
Je ne recommande pas de mettre le hachage du mot de passe de la réclamation, et je crois qu'il n'y a pas de moyen direct d'invalider jeton lorsque le mot de passe est changé.
Mais si vous êtes Ok avec les coups de la DB avec chaque demande d'envoyer à partir de l'application client à un API protégé point de fin, alors vous avez besoin pour stocker Jeton Guid (Identificateur peut-être) pour chaque jeton accordée pour le propriétaire de la ressource demandée. Vous pouvez ensuite affecter le jeton Identifiant comme une revendication personnalisée pour ce jeton, après cela, vous devez cocher cette table avec chaque demande de recherche pour le jeton de l'identificateur et le nom d'utilisateur pour le propriétaire de la ressource.
Une fois le mot de passe est changé, vous supprimez ce jeton identificateur d'enregistrement pour cette ressource propriétaire (utilisateur) et la prochaine fois que le jeton envoyé par le client, il sera rejeté parce que le dossier de ce jeton identificateur de ressource et de propriétaire a été supprimé.
Je l'ai basé mon approche sur Taiseer de la suggestion. L'essentiel de la solution est la suivante. Chaque fois qu'un utilisateur modifie son mot de passe (et quand les registres), un nouveau GUID est générée et enregistrée dans la base de données dans la table User. J'appelle ce GUID le mot de passe timbre, et de le stocker dans une propriété appelée
LatestPasswordStamp
.Ce timbre doit être envoyé au client dans le cadre de l'jeton comme une revendication. Ceci peut être obtenu avec le code suivant dans la
GrantResourceOwnerCredentials
méthode de laOAuthAuthorizationServerProvider
-la mise en œuvre.Ce timbre va être envoyé par le client au serveur à chaque requête, et il est vérifié que le timbre n'a pas été modifié dans la base de données. Si elle l'est, cela signifie que l'utilisateur a changé leur mot de passe, éventuellement à partir d'un autre appareil. La vérification est effectuée dans notre coutume d'autorisation de filtre comme ceci.
De cette façon, le client obtient une autorisation d'erreur si on tente d'autoriser lui-même avec un jeton qui a été délivré avant le mot de passe a été changé.