it-swarm.com.de

ASP.NET Web API 2: Wie melde ich mich mit externen Authentifizierungsdiensten an?

Laut diesem Beitrag http://www.asp.net/web-api/overview/security/external-authentication-services ... kann ich mich mit einem lokaler Authentifizierungsdienst (mit dem neuen ASP.NET-Identitätsframework)

ich kann jedoch keine exemplarische Vorgehensweise zum ordnungsgemäßen Aufrufen (von einer mobilen App oder Postman ) der in der Visual Studio 2013 SPA-Vorlage generierten Standard-Web-API finden.

Kann mir jemand helfen?

48
acor3

Ich hatte heute das gleiche Problem und fand die folgende Lösung:

Holen Sie sich zunächst alle verfügbaren Anbieter

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

Die Antwortnachricht ist eine Liste im json-Format

[{"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"}]

Senden Sie nun eine GET-Anfrage an die URL des Anbieters, den Sie verwenden möchten. Sie werden zur Anmeldeseite des externen Anbieters weitergeleitet. Geben Sie Ihre Anmeldeinformationen ein und Sie werden zurück zu Ihrer Site weitergeleitet. Analysieren Sie nun den access_token Aus der URL.

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

Wenn der Benutzer bereits ein lokales Konto hat, wird das Cookie .AspNet.Cookies Gesetzt und Sie sind fertig. Wenn nicht, wird nur das Cookie .AspNet.ExternalCookie Gesetzt und Sie müssen ein lokales Konto registrieren.

Es gibt eine API, um herauszufinden, ob der Benutzer registriert ist:

GET /api/Account/UserInfo

Die Antwort ist

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

Rufen Sie an, um ein lokales Konto für den Benutzer zu erstellen

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

Senden Sie jetzt die gleiche Anfrage mit der Provider-URL wie zuvor

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

Diesmal hat der Benutzer jedoch bereits ein Konto und wird authentifiziert. Sie können dies überprüfen, indem Sie erneut /api/Account/UserInfo Aufrufen.

Extrahieren Sie nun den access_token Aus der URL. Sie müssen jeder Anfrage den Authorization: Bearer [access_token] - Header hinzufügen.

111
berhir

Ich habe ein weiteres post gefunden, das ziemlich genau zeigt, wie diese externe Authentifizierung funktioniert. Der Client ist WPF und der Server verwendet die ASP.NET-Identität.

5
T N