Pamiętałam, że Maciek Aniserowicz wspominał kiedyś o social logowaniu w poście. Postanowiłam, że zrobię tak samo. Zainstalowałam pakiet SimpleAuthentication, utworzyłam klasę Provider, przeszłam w aplikacji do url https://localhost/authentication/redirect/facebook i nic? Ale jak to? Przecież miało działać, a tu same błędy.
Okazało się, że potrzebuję jeszcze Autofac i Glimpse. Ok, zrobione. No i nadal nie działa:
Tutaj z pomocą przyszedł pewien kolega – okazało się, że na odpowiedniej stronie trzeba dodać domenę, na której jest aplikacja:
- dla Facebooka: https://developers.facebook.com/apps
- dla Google: https://console.developers.google.com/apis
- dla GitHub: https://github.com/settings/applications
Okazało się to całkiem proste!
Dla Facebooka (wersja lokalna aplikacji) wygląda to następująco:
Odpowiednie App Id oraz App Secret należy wpisać do Web.config.
<authenticationProviders> <providers> <add name="Facebook" key="11111111" secret="22222222" /> <add name="GitHub" key="33333333" secret="44444444" /> <add name="Google" key="55555555.apps.googleusercontent.com" secret="66666666" /> </providers> </authenticationProviders>
Na produkcji oczywiście musiałam zarejestrować nową aplikację z nowymi kluczami i podmienić je w Web.config (najlepiej używając Transform w Web.Release.config).
<authenticationProviders> <providers> <add name="Facebook" key="99999999" secret="88888888" xdt:Transform="SetAttributes" xdt:Locator="Match(name)" /> <add name="GitHub" key="77777777" secret="66666666" xdt:Transform="SetAttributes" xdt:Locator="Match(name)" /> <add name="Google" key="55555555.apps.googleusercontent.com" secret="44444444" xdt:Transform="SetAttributes" xdt:Locator="Match(name)" /> </providers> </authenticationProviders>
Rezultaty mojej pracy widać już na przy otwarciu aplikacji:
A po zalogowaniu w prawym górnym oknie aplikacji widać:
Dla zainteresowanych dorzucam jeszcze kod AuthenticationCallbackProvider:
public ActionResult Process(HttpContextBase context, AuthenticateCallbackData model) { var email = model.AuthenticatedClient.UserInformation.Email; var name = model.AuthenticatedClient.UserInformation.Name; var userName = model.AuthenticatedClient.UserInformation.UserName; var picture = model.AuthenticatedClient.UserInformation.Picture; var loggedUser = new User() { Id = Guid.NewGuid().ToString(), Name = name, ImageUrl = picture, Email = email }; return new RedirectToRouteResult(new RouteValueDictionary { { "action", "SetUser" }, { "controller", "User" }, { "userJson", JsonConvert.SerializeObject(loggedUser) } }); } public ActionResult OnRedirectToAuthenticationProviderError(HttpContextBase context, string errorMessage) { return new RedirectResult("/", true); }
PS – logowanie przez Google zadziałało mi tylko dla wersji szyfrowanej https, a nie działało dla http