2017-09-23 3 views
1

Ich erstelle eine Web-API, in der ich Leute über Facebook anmelden muss.Zu viele Weiterleitungen - Owin Externe Anmeldung mit Facebook Asp.Net

Ich folge this guide.

Sobald ich meine Anmeldeinformationen an Facebook übermittelt habe, sollte es zu einer Aktion umleiten, aber stattdessen heißt es: "Zu viele Redirects." enter image description here

Dies ist, was ich in meinem Startup.cs haben: Klasse:

app.UseExternalSignInCookie(Microsoft.AspNet.Identity.DefaultAuthenticationTypes.ExternalCookie); 
      FacebookAuthenticationOptions facebookAuthOptions = new FacebookAuthenticationOptions() 
      { 
       AppId = "myAppId", 
       AppSecret = "myAppKey", 
       Provider = new FacebookAuthProvider() 
      }; 
      app.UseFacebookAuthentication(facebookAuthOptions); 

mein FacebookAuthProvider Dies ist

public class FacebookAuthProvider : FacebookAuthenticationProvider 
    { 
     public override Task Authenticated(FacebookAuthenticatedContext context) 
     { 
      context.Identity.AddClaim(new System.Security.Claims.Claim("ExternalAccessToken", context.AccessToken)); 
      return Task.FromResult<object>(null); 
     } 
    } 

Das ist mein ChallengeResult Klasse:

public class ChallengeResult : IHttpActionResult 
    { 
     public string LoginProvider { get; set; } 
     public HttpRequestMessage Request { get; set; } 

     public ChallengeResult(string loginProvider, ApiController controller) 
     { 
      LoginProvider = loginProvider; 
      Request = controller.Request; 
     } 
     public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken) 
     { 
      Request.GetOwinContext().Authentication.Challenge(LoginProvider); 

      HttpResponseMessage response = new HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized); 
      response.RequestMessage = Request; 
      return Task.FromResult<HttpResponseMessage>(response); 
     } 
    } 

Und dies ist der Controller, dass ich das Token von Facebook bekommen bin mit nach Benutzer angemeldet hat:

[HttpGet] 
     [OverrideAuthentication] 
     [HostAuthentication(DefaultAuthenticationTypes.ExternalCookie)] 
     [AllowAnonymous] 
     //[Route("ExternalLogin", Name = "ExternalLogin")] 
     public IHttpActionResult GetExternalLogin(string provider) 
     { 
      string redirectUri = string.Empty; 
      AppUserManager manager = new AppUserManager(new AppUserStore(new AppContext())); 

      if (!User.Identity.IsAuthenticated) 
      { 
       return new ChallengeResult(provider, this); 
      } 

      ExternalLoginData externalLogin = ExternalLoginData.FromIdentity(User.Identity as ClaimsIdentity); 

      UserLoginInfo loginInfo = new UserLoginInfo(externalLogin.LoginProvider, externalLogin.ProviderKey); 

      IdentityUser user = manager.Find(loginInfo); 

      bool hasRegistered = user != null; 

      ValidateRedirectUri(this.Request, ref redirectUri); 

      redirectUri = String.Format("{0}#external_access_token={1}&provider={2}&haslocalaccount={3}&external_user_name={4}", 
              redirectUri, 
              externalLogin.AccessToken, 
              externalLogin.LoginProvider, 
              hasRegistered.ToString(), 
              externalLogin.UserName); 

      return Redirect(redirectUri); 
     } 

Eine Sache, die ich über wirklich neugierig bin, ist, dass, wenn ich Kommentar- diese Leitung:

[Route("ExternalLogin", Name = "ExternalLogin")] 

Und versuchen sie, dass die Steuerung mit diesem neuen Weg zuzugreifen, heißt es, dass User (der in der GetExternalLogin des if) ist null.

Hier ist der Link, den ich Test bin: http://localhost:62887/api/ExternalAuth/GetExternalLogin?provider=Facebook&redirect_uri=http://localhost:62887/api/ExternalAuth/LoggedIn

Und nachdem sich der Benutzer erfolgreich angemeldet hat, ist dies die Aktion, die er angenommen hat, umgeleitet werden:

[HttpGet] 
     public IHttpActionResult LoggedIn() 
     { 
      return Ok(new { Message = "You've been successfully logged in! :)" }); 
     } 

Antwort

0

I Ich werde mich umbringen, ich habe es endlich funktioniert. Ich musste nur das NuGet-Paket von 2.1 auf 3.1 aktualisieren ...>:/

Verwandte Themen