web-dev-qa-db-fra.com

ASP.NET Web API 2: comment me connecter avec des services d'authentification externes?

Selon cet article http://www.asp.net/web-api/overview/security/external-authentication-services ... Je peux me connecter avec un service d'authentification local (avec le nouveau cadre d'identité ASP.NET)

mais je ne trouve pas de procédure pas à pas pour appeler correctement (à partir d'une application mobile ou Postman ) l'API Web par défaut générée dans le modèle SPA de Visual Studio 2013.

Quelqu'un peut-il m'aider?

48
acor3

J'ai eu le même problème aujourd'hui et j'ai trouvé la solution suivante:

Obtenez d'abord tous les fournisseurs disponibles

GET /api/Account/ExternalLogins?returnUrl=%2F&generateState=true

Le message de réponse est une liste au format json

[{"name":"Facebook",
  "url":"/api/Account/ExternalLogin?provider=Facebook&response_type=token&client_id=self&redirect_uri=http%3A%2F%2Flocalhost%3A15359%2F&state=QotufgXRptkAfJvcthIOWBnGZydgVkZWsx8YrQepeDk1",
  "state":"QotufgXRptkAfJvcthIOWBnGZydgVkZWsx8YrQepeDk1"}]

Envoyez maintenant une demande GET à l'URL du fournisseur que vous souhaitez utiliser. Vous serez redirigé vers la page de connexion du fournisseur externe. Remplissez vos informations d'identification et vous serez redirigé vers votre site. Maintenant, analysez le access_token à partir de l'url.

http://localhost:15359/#access_token=[..]&token_type=bearer&expires_in=[..]&state=QotufgXRptkAfJvcthIOWBnGZydgVkZWsx8YrQepeDk1

Si l'utilisateur possède déjà un compte local, le .AspNet.Cookies le cookie est défini et vous avez terminé. Sinon, seul le .AspNet.ExternalCookie le cookie est défini et vous devez créer un compte local.

Il y a une API pour savoir si l'utilisateur est enregistré:

GET /api/Account/UserInfo

La réponse est

{"userName":"xxx","hasRegistered":false,"loginProvider":"Facebook"}

Pour créer un compte local pour l'utilisateur, appelez

POST /api/Account/RegisterExternal
Authorization: Bearer VPcd1RQ4X... (access_token from url)
Content-Type: application/json
{"UserName":"myusername"}

Envoyez maintenant la même demande avec l'URL du fournisseur qu'avant

GET /api/Account/ExternalLogin?provider=Facebook&response_type=token&client_id=self&redirect_uri=http%3A%2F%2Flocalhost%3A15359%2F&state=QotufgXRptkAfJvcthIOWBnGZydgVkZWsx8YrQepeDk1

Mais cette fois, l'utilisateur a déjà un compte et s'authentifie. Vous pouvez le vérifier en appelant /api/Account/UserInfo encore.

Maintenant, extrayez le access_token à partir de l'url. Vous devez ajouter le Authorization: Bearer [access_token] en-tête pour chaque demande que vous faites.

111
berhir

J'ai trouvé un autre post montrant de jolis détails sur le fonctionnement de cette authentification externe. Le client est WPF et le serveur utilise l'identité ASP.NET.

5
T N