2017-09-23 26 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 ...>:/