2017-09-23 101 views
1

我正在創建一個web-api,我需要登錄人們使用Facebook。重定向過多 - Owin外部登錄Facebook Asp.Net

我跟隨this guide

一旦我向Facebook提供我的憑據,它應該重定向到一個操作,但它會說:「太多的重定向。」 enter image description here

這是我在Startup.cs得:

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

這是我FacebookAuthProvider:類:

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); 
     } 
    } 

這是我ChallengeResult等級:

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); 
     } 
    } 

這是我用來獲取來自Facebook的令牌在用戶登錄後的控制器:

[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); 
     } 

一兩件事,我真的很好奇,是,如果我取消這個行:

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

,然後嘗試使用新的路由訪問控制,它說,User(在GetExternalLogin的,當一)是null

這是我用來測試的鏈接: http://localhost:62887/api/ExternalAuth/GetExternalLogin?provider=Facebook&redirect_uri=http://localhost:62887/api/ExternalAuth/LoggedIn

並且在用戶成功登錄,這是他應該被重定向動作:

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

回答

0

我要殺了自己,我終於搞定了。我只需要將NuGet包從2.1更新到3.1 ...>:/