web-dev-qa-db-fra.com

Authentification par jeton d'API Web avec une base de données d'utilisateurs personnalisée

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

Inspiré par cet article , j'ai mis en œuvre ma propre méthode d'authentification des utilisateurs basée sur des jetons, mais je manque de l'exhaustivité et de la (ré) assurance de l'utilisation d'un cadre de sécurité établi.

Existe-t-il un moyen d’intégrer un cadre existant, par exemple OAuth2, dans le cadre de mon projet actuel compte tenu des contraintes que j'ai mentionnées ci-dessus? Je ne sais pas si cela fait une différence, mais je suis autonome avec OWIN.

64
djikay

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

  • Faire une classe utilisateur personnalisée qui implémente IUser
  • Définir un magasin d'utilisateurs personnalisé qui implémente public class UserStoreService : IUserStore<CustomUser>, IUserPasswordStore<CustomUser>
  • câbler tout

Comme la réponse est assez détaillée, je viens de fournir les étapes de base ... Les détails sont ici: Comment personnaliser l'authentification sur mon propre ensemble de tableaux dans asp.net web api 2?

C'est également un contenu très précieux qui s'applique également à l'API Web:

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

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

HTH

19
silverfighter

Je suis tombé sur une solution en essayant de mettre en œuvre l'authentification par jeton JSON au sein de l'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 requête Http ( pas via les cookies) et pas en utilisant Microsoft Cadre d'identité.

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

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<object>(null);
        }

Naturellement, vous devriez remplacer ce bit de code ci-dessus par votre propre méthode pour vérifier votre (vos) base (s) de données utilisateur (s-préexistante). Une fois que j'ai implémenté cela, je me suis rendu compte que vous n'aviez pas besoin d'utiliser le nouveau code de première infrastructure d'identité que Visual Studio installait pour vous.

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

1) Création d’un projet vide et sélection Modification de l’authentification/comptes d’utilisateur individuels . Cela installe la plupart des références et des fichiers requis dont vous avez besoin pour utiliser l'authentification par jeton au moyen de cookies, ainsi que les fichiers de structure d'identité avec code en premier.

2) Edité ces fichiers en suivant l'exemple de Taiseer Joudeh. Cela nécessite entre autres de nouveaux objets tels que CustomOAuthProvider.cs. Et vous devez implémenter votre propre vérification 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<object>(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) Élagage de mon projet de fichiers superflus (AccountBindingModels.cs, AccountViewModels.cs, IdentityModels.cs, ApplicationOAuthProvider.cs, identityConfig.cs, AccountBindingModels.cs, AccountViewModels.cs). En gros, plus de références d'identité Microsoft.

Je suis sûr que l’identité de Microsoft.identity est excellente, mais j’étais ennuyé par l’implémentation en premier code de bases de données alors que j’utilisais déjà des bases de données héritées d’une structure différente, etc. J'espère que cela aidera. Je suis assez satisfait du résultat (après quelques jours de déconner pour le faire fonctionner).

2
brando

Je ne voulais pas utiliser les 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 les détails complets ici authentification de base de jeton de l'API Web OAuth avec une base de données personnalisée

Pour Authentification de base de rôle avec base de données personnalisée J'espère que cela vous aidera

1
Ali Adravi

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 d'applications HTML/JS et Windows Phone natives, par rapport à une simple table SQL Server et à AD. Fonctionne bien, presque zéro mal de tête.

1
Mikko Viitala

Cela pourrait être une approche complètement folle et invalide pour vous, mais j’étais confronté à un défi similaire: une nouvelle application Web (MVVM + WebAPI), ancien système utilisé pour émettre et valider des 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 utilisateur graphique (l'application Web MVVM), je a décidé d'utiliser un jeton "basé sur les cookies" produit par FormsAuthentication. Le cookie/ticket FormsAutnentication est sécurisé par la sécurité magique interne .net (qui, je suppose, est parfaitement sûre et incassable).

Dans mon cas, le cookie contient simplement le ticket émis par le système existant (mais vous pouvez également stocker davantage de détails, par exemple en jSONSérialisant un type personnalisé). Pendant 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é.

1
Emil G