2017-09-23 14 views
1

Facebookを使用してユーザーをログインする必要のあるweb-apiを作成しています。リダイレクトが多すぎます - Owin外部ログイン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年代の1つが)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にアップデートしなければならなかった...>:/

関連する問題