web-dev-qa-db-fra.com

API Web AngularJS + ASP.NET + Authentification ASP.NET MVC

Je suis nouveau sur AngularJS et j'essaie de l'évaluer pour ma nouvelle application Web.

Exigence:

J'aurai une API Web ASP.NET qui sera consommée à partir d'un Android, d'un iPhone et d'une application Web (ASP.NET MVC). L'identité ASP.NET sera implémentée dans l'API Web. Les trois applications appellent la méthode de connexion de Web API pour obtenir le jeton d'authentification.

Problème:

Mon problème est de savoir comment obtenir ASP.NET MVC authentification côté serveur work (en synchronisation avec l'API Web, je n'ai donc pas besoin de me connecter à ASP.NET MVC séparément) pendant que Angular passe un appel pour obtenir le modèle/vue HTML, les fichiers JavaScript ou d’autres ressources. J'ai consulté de nombreux articles et blogs sur AngularJS, mais je suis toujours incapable de trouver un modèle de sécurité adapté à mes besoins.

Solution possible:

Serait-ce une bonne idée d’appeler l’appel de connexion à l’application ASP.NET MVC au lieu de l’API Web directement, l’application ASP.NET MVC appelle alors l’API Web pour la connexion, et une fois authentifié, enregistrez le jeton d’authentification en session et créez cookie FormsAuthentication et dans les données de cookie, enregistrez le jeton d'authentification crypté. De plus, définissez le jeton auth dans ng-init quelque part dans HTML pour que le jeton soit dans la portée AngularJS. Désormais, lorsque AngularJS essaie d'appeler l'application ASP.NET MVC pour obtenir du code HTML, authentifiez/autorisez l'utilisateur en faisant correspondre les données décryptées par le cookie aux données d'authentification en session. De plus, AngularJS enverra le jeton auth dans l’en-tête pour appeler les méthodes Web API directement pour tous les appels ultérieurs de manipulation de données via l’API Web.

18
Haider

J'ai résolu le problème avec une solution très étroite. Je viens juste de m'assurer que les deux lignes de code suivantes sont utilisées dans la méthode Register de WebApiConfig:

config.SuppressDefaultHostAuthentication();
config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

C'est tout. Désormais, mes contrôleurs MVC recherchent une autorisation dans le cookie de session, tandis que mes contrôleurs API Web recherchent le jeton d'authentification dans l'en-tête de chaque demande. De plus, l’API Web envoie un jeton (JSON) et un cookie de session lui-même en réponse à la demande de connexion/d’authentification, par exemple. http:\\www.mydomain.com\token.

Alors maintenant, j'envoie ma demande de connexion à l'API Web pour obtenir le jeton ainsi que le cookie de session. Un cookie de session sera automatiquement envoyé à chaque demande, je n'aurai donc pas à me soucier de l'autorisation de mes contrôleurs MVC. Pour les appels d'API Web, j'envoie le jeton d'authentification dans l'en-tête de chaque demande, car les contrôleurs d'API Web ne se soucient pas du cookie de session envoyé avec la demande.

8
Haider

Vaut également le coup d'oeil:

https://bitbucket.org/david.antaramian/so-21662778-spa-authentication-example/overview

(basé sur this SO question )

Attention: ce n'est pas pour les âmes sensibles ...

  • API Web ASP.NET 2
  • HTML5 + AngularJS + $ ngRoute
  • Échafaudage NuGet
  • Yeoman (Grunt/Bower)
  • Cadre Owin (OAuth 2.0)
  • CORS
4
Dunc

Je pense que vous êtes sur le bon chemin. Je voudrais stocker les jetons dans un Angular Service pour vous faciliter la tâche ( http://blog.brunoscopelliti.com/deal-with-users-authentication-in-an-angularjs-web- app ). Je ne comprends pas très bien ce que vous entendez par "AngularJS essaie d'appeler l'application ASP.NET MVC pour obtenir du code HTML", vous ne devriez pas avoir besoin de sécuriser l'application MVC, il s'agit simplement d'exécuter votre Angular. _ droite? L'API est également l'élément que vous souhaitez sécuriser. 

0
Steve Sloka