Ответ 1
Сегодня у меня была та же проблема, и я нашел следующее решение:
Сначала получите всех доступных поставщиков
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 на адрес провайдера, который вы хотите использовать. Вы будете перенаправлены на страницу входа внешнего поставщика. Заполните свои учетные данные, и вы будете перенаправлены обратно на ваш сайт. Теперь проанализируйте access_token
по URL-адресу.
http://localhost:15359/#access_token=[..]&token_type=bearer&expires_in=[..]&state=QotufgXRptkAfJvcthIOWBnGZydgVkZWsx8YrQepeDk1
Если у пользователя уже есть локальная учетная запись, cookie .AspNet.Cookies
установлен, и все готово. Если нет, настроен только файл cookie .AspNet.ExternalCookie
, и вы должны зарегистрировать локальную учетную запись.
Существует 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
снова.
Теперь извлеките access_token
из URL-адреса. Вы должны добавить заголовок Authorization: Bearer [access_token]
для каждого вашего запроса.