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