web-dev-qa-db-ja.com

ASP.NET Web API 2:外部認証サービスでログインするにはどうすればよいですか?

この投稿によると http://www.asp.net/web-api/overview/security/external-authentication-services ...でログインできますlocal認証サービス(新しいASP.NET IDフレームワークを使用)

しかし、Visual Studio 2013 SPAテンプレートで生成されたデフォルトのWeb APIを(モバイルアプリまたは Postman から)適切に呼び出すためのウォークスルーが見つかりません。

誰も私を助けることができますか?

48
acor3

今日も同じ問題があり、次の解決策が見つかりました。

最初に利用可能なすべてのプロバイダーを取得します

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

応答メッセージは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"}]

GETリクエストを、使用するプロバイダーのURLに送信します。外部プロバイダーのログインページにリダイレクトされます。資格情報を入力すると、サイトにリダイレクトされます。次に、URLからaccess_tokenを解析します。

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

ユーザーが既にローカルアカウントを持っている場合は、.AspNet.Cookies Cookieが設定されて完了です。そうでない場合は、.AspNet.ExternalCookie Cookieのみが設定され、ローカルアカウントを登録する必要があります。

ユーザーが登録されているかどうかを確認するためのAPIがあります。

GET /api/Account/UserInfo

応答は

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

ユーザーのローカルアカウントを作成するには、呼び出します

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

これで、以前と同じプロバイダーURLで同じリクエストを送信します

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

しかし、今回はユーザーはすでにアカウントを持ち、認証されます。これを確認するには、/api/Account/UserInfoを再度呼び出します。

次に、URLからaccess_tokenを抽出します。作成するすべてのリクエストにAuthorization: Bearer [access_token]ヘッダーを追加する必要があります。

111
berhir

別の post が見つかりました。この外部認証の仕組みを詳細に示しています。クライアントはWPFであり、サーバーはASP.NET Identityを使用します。

5
T N