Authentification de jeton d’API Web avec une firebase database utilisateur personnalisée

Je développe un service Web API 2.1 qui doit authentifier les clients de connexion (clients HTML5 / JS que je vais créer et contrôler). Malheureusement, les informations utilisateur (nom d’utilisateur, mots de passe, mots de passe, rôles et bien plus encore) sont stockées dans une firebase database existante (SQL Server) à laquelle je n’ai qu’un access en lecture. La table de firebase database Utilisateurs a été créée il y a 5 ou 6 ans sans aucune référence aux structures de sécurité. Il s’agit donc d’un format entièrement personnalisé. Je ne suis pas autorisé à modifier les données ou la structure de la firebase database.

Inspiré par cet article , j’ai lancé ma propre méthode d’authentification des utilisateurs basée sur des jetons, mais je ne dispose pas de l’exhaustivité et de l’assurance de l’utilisation d’une infrastructure de sécurité établie.

Est-il possible d’intégrer un cadre existant, par exemple OAuth2, dans mon projet actuel, compte tenu des contraintes mentionnées ci-dessus? Je ne sais pas si cela fait une différence, mais je m’auto-héberge en utilisant OWIN.

EDIT: Je ne sais pas pourquoi quelques personnes ont rejeté cette question – est-ce vraiment si mauvais? C’est une vraie question en ce qui me concerne, et j’aimerais avoir une réponse (même si c’est ” non, tu ne peux pas faire ça parce que … “). Si ces personnes pouvaient expliquer leurs raisons dans un commentaire, ce serait apprécié.

C’est une bonne réponse à une question similaire. Il dit essentiellement:

  • Créer une classe d’utilisateurs personnalisée qui implémente IUser
  • Définir un magasin d’utilisateurs personnalisé qui implémente public class UserStoreService : IUserStore, IUserPasswordStore
  • tout enfiler

Puisque la réponse est assez complète, je viens de fournir les étapes de base … les détails sont ici: Comment personnaliser l’authentification à mon propre ensemble de tables dans asp.net web api 2?

C’est également un contenu très précieux qui s’applique également à web api:

Personnalisation de l’authentification ASP.NET avec l’identité par JumpStart

https://channel9.msdn.com/Series/Customizing-ASPNET-Authentication-with-Identity

HTH

Je suis tombé sur une solution tout en essayant d’implémenter l’authentification par jeton json au sein d’API Web. Il est important de noter que ma solution gère l’authentification en envoyant un jeton json via l’en-tête d’authentification de la demande HTTP (et non via les cookies ), sans utiliser Microsoft.Identity Framework.

Quoi qu’il en soit, j’ai essentiellement implémenté dans un livre de recettes la solution utile décrite ici par Taiseer Joudeh: http://bitoftech.net/2014/10/27/json-web-token-asp-net-web-api-2-jwt- owin-server-autorisation /

L’essentiel à noter est le bit de code suivant:

 //Dummy check here, you need to do your DB checks against memebrship system http://bit.ly/SPAAuthCode if (context.UserName != context.Password) { context.SetError("invalid_grant", "The user name or password is incorrect"); //return; return Task.FromResult(null); } 

Naturellement, vous remplacerez ce bit de code ci-dessus par votre propre méthode pour vérifier votre (vos) base (s) d’utilisateur (probablement pré-existante). Une fois que j’ai implémenté cela, j’ai réalisé que vous n’avez pas besoin d’utiliser le nouveau cadre d’identité du premier code que Visual Studio installe pour vous.

Pour faire ce travail j’ai fait ce qui suit:

1) A créé un projet vide et sélectionné Modifier l’authentification / comptes utilisateur individuels . Cela installe la plupart des références et des fichiers requirejs dont vous avez besoin pour utiliser l’authentification par jeton via les cookies, ainsi que les fichiers de structure d’identité de code-first.

2) Édité ces fichiers en suivant l’exemple de Taiseer Joudeh. Cela nécessite de nouveaux objects tels que CustomOAuthProvider.cs, entre autres. Et vous devez implémenter votre propre vérification d’utilisateur / mot de passe en personnalisant ce bloc de code:

if (context.UserName != context.Password) { context.SetError("invalid_grant", "The user name or password is incorrect"); //return; return Task.FromResult(null); }

Lien vers les instructions de Taiseer Joudeh: http://bitoftech.net/2014/10/27/json-web-token-asp-net-web-api-2-jwt-owin-authorization-server/

3) Élaguer mon projet de fichiers superflus (AccountBindingModels.cs, AccountViewModels.cs, IdentityModels.cs, ApplicationOAuthProvider.cs, identityConfig.cs, AccountBindingModels.cs, AccountViewModels.cs). Fondamentalement, plus de références d’identité Microsoft.

Je suis sûr que la chose de microsoft.identity est excellente, mais j’ai été contrarié par l’implémentation en code des bases de données alors que j’utilisais déjà des bases de données existantes de structure différente, etc. J’espère que cela vous aidera. Je suis assez satisfait du résultat (après quelques jours de bricolage pour le faire fonctionner).

Quelqu’un d’autre, ayant la compétence, peut expliquer les options. Mais si l’authentification en tant que service est une option, consultez Auth0 @ https://auth0.com

J’ai testé le service (en tant que plug-in Azure) à l’aide des applications HTML / JS et Windows Phone natives, par rapport à une simple table Sql Server et à AD. Fonctionne au charme liek, près de zéro mal de tête.

Je ne voulais pas utiliser de classes existantes et enfin sortir quelque chose de très simple comme

 var userName = context.UserName; var password = context.Password; var userService = new UserService(); // our created one var user = userService.ValidateUser(userName, password); if (user != null){ ....... } 

Voir tous les détails ici Authentification de base de jeton API Web OAuth avec firebase database personnalisée

J’espère que ça va aider quelqu’un

Cela peut être une approche complètement folle et non valide pour vous, mais j’ai dû faire face à un défi similaire: nouvelle application Web (MVVM + WebAPI), système hérité utilisé pour émettre et valider les jetons. Inspiré par http://tech.pro/tutorial/1216/implementing-custom-authentication-for-aspnet , et parce que mon application serait principalement utilisée par son interface graphique accompagnée (l’application web MVVM), j’ai décidé d’utiliser un “cookie based “jeton produit par FormsAuthentication. Le cookie / ticket FormsAutnentication est sécurisé par la sécurité magique interne de .net (que je présume complètement sûre et incassable).

Dans mon cas, le cookie contient simplement le ticket émis par le système hérité (mais vous pouvez également y stocker plus de détails, par exemple en JSONSerializing un type personnalisé). Lors de l’autorisation, mon système valide le jeton par rapport au système existant. Je suppose que vous pourriez utiliser quelque chose de similaire avec un AuthorizationFilter personnalisé.