Authentification de token par API Web avec une base de données utilisateur personnalisée

je développe un service D'API web 2.1 qui doit authentifier les clients connectés (clients HTML5/JS que je vais créer et contrôler). Malheureusement, les informations utilisateur (nom d'utilisateur, hachage de mot de passe, rôles et beaucoup, beaucoup plus d'informations) sont stockées dans une base de données existante (SQL Server) à laquelle je n'ai accès qu'en lecture. La table de base de données des utilisateurs a été créée il y a 5-6 ans sans aucune référence aux cadres de sécurité, donc c'est un format complètement personnalisé. Je ne suis pas autorisé à faire toute modifications apportées aux données ou à la structure de la base de données.

inspiré par cet article , j'ai roulé ma propre méthode d'authentification des utilisateurs basée sur des jetons, mais je manque l'exhaustivité et (re)l'assurance d'utiliser un cadre de sécurité établi.

y a-t-il un moyen d'intégrer un cadre existant, par exemple OAuth2, dans mon projet actuel étant donné les contraintes que j'ai mentionnées ci-dessus? Je ne sais pas si ça fait une différence, mais je suis auto-hébergement en utilisant OWIN.

EDIT: je ne sais pas pourquoi un couple de personnes downvoted cette question - est-il 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, vous ne pouvez pas faire cela parce que... "). Si ces gens peuvent expliquer leurs raisons dans un commentaire, ce serait apprécié.

56
demandé sur djikay 2014-06-19 03:32:30

5 réponses

C'est une bonne réponse à une question similaire. En gros, il dit:

  • faire une classe d'utilisateur personnalisé qui met en œuvre IUser
  • définit un magasin utilisateur personnalisé qui implémente public class UserStoreService : IUserStore<CustomUser>, IUserPasswordStore<CustomUser>
  • fil de tout ce qui

comme la réponse est assez vaste, je viens de vous fournir les étapes de base... les détails sont ici: Comment personnaliser l'authentification à mon propre jeu de tableaux asp.net Web api 2?

c'est aussi un contenu très précieux qui s'applique aussi à l'api web:

personnalisation ASP.NET authentification Avec identité par JumpStart

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

HTH

15
répondu silverfighter 2017-05-23 11:47:16

je suis tombé sur une ma solution en essayant d'implémenter l'authentification JSON token dans 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.L'identité de cadre.

quoi qu'il en soit, j'ai essentiellement mis en œuvre dans un livre de cuisine la solution décrite utilement ici par Taiseer Joudeh: http://bitoftech.net/2014/10/27/json-web-token-asp-net-web-api-2-jwt-owin-authorization-server /

la clé à 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 remplacerez ce morceau de code ci-dessus par votre propre méthode pour vérifier votre (s) base(s) de données utilisateur (s) (probablement préexistante). Une fois que j'ai mis en œuvre ceci, j'ai réalisé que vous n'avez pas besoin d'utiliser le nouveau code d'abord le cadre d'identité ce studio visuel s'installe pour vous.

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

1) a créé un projet vide et a sélectionné authentification de changement/comptes D'utilisateur individuels . Cela installe la plupart des références et des fichiers nécessaires dont vous avez besoin à partir de la boîte pour utiliser l'authentification token par le biais de cookies ainsi que les fichiers Code-first identity framework.

2) édité ces dossiers suivant la piste de Taiseer Joudeh. Cela nécessite Certains nouveaux objets tels que CustomOAuthProvider.cs, entre autres. Et vous devez mettre en œuvre 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<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) Mon projet de fichiers externes (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 le microsoft.la chose de l'identité est excellente, mais j'ai été ennuyé par le code-première mise en œuvre de bases de données quand j'étais déjà en utilisant certaines bases de données héritées d'une structure différente, etc. Espérons que cette aide. Je suis tout à fait satisfait du résultat (après quelques jours de déconner à le faire fonctionner).

2
répondu brando 2015-07-18 21:37:45

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

j'ai testé le service (en tant que plugin Azure) en utilisant à la fois HTML/JS - et les applications natives Windows Phone, contre simple table Sql Server et AD. Ça fait du charme à liek, presque aucun mal de tête.

1
répondu Mikko Viitala 2014-06-19 20:56:41

Je ne voulais pas utiliser de classes existantes et finalement 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 OAuth Web API token base authentication with custom database

pour authentification de base de rôle avec base de données personnalisée J'espère que ça aidera

1
répondu Ali Adravi 2018-10-04 23:36:15

cela pourrait être une approche complètement insensé et invalide pour vous, mais j'ai fait face à un défi similaire: nouvelle application web (MVVM + WebAPI), système d'héritage 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 GUI accompagné (le MVVM webapp), j'ai décidé d'utiliser un" cookie basé " token produit par FormsAuthentication. Le FormsAutnentication le cookie / ticket est sécurisé par .net internal magic security (je suppose que id est totalement sûr et incassable).

dans mon cas, le cookie contient simplement le billet émis par le système traditionnel, (mais vous pouvez y stocker plus de détails, par exemple en personnalisant 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 fileur D'autorisation personnalisé.

0
répondu Emil G 2015-04-29 14:01:37