2014-04-29 14 views
8

Sto utilizzando i provider di autenticazione esterna OWIN nel mio progetto ASP.Net MVC 5/WebApi 2 e ho riscontrato uno strano problema.Il primo tentativo di accesso esterno reindirizza all'azione di accesso, il secondo funziona

Il flusso di lavoro di accesso è esattamente come qui su SO. Utente preme il pagina di login, sceglie un fornitore e viene registrato nel mio problema è che il primo clic su un fornitore di reindirizza indietro alla stessa pagina di login:.

http://localhost:57291/Account/Login?ReturnUrl=%2fAccount%2fExternalLogin 

Questo avrebbe senso se l'azione ExternalLogin verrebbe a mancare l'attributo AllowAnonymous.

Quando l'utente fa clic una seconda volta, tutto funziona.

L'ho provato anche con diversi browser e il problema è coerente su Chrome, IE11 e Firefox.

Login.cshtml:

@using (Html.BeginForm("ExternalLogin", "Account", new { ReturnUrl = ViewBag.ReturnUrl })) 
{ 
    <fieldset> 
     <legend>@Strings.ExternalAuthenticationProvidersDescription</legend> 
     <p> 
      @foreach (var p in Model.ExternalAuthenticationProviders) 
      { 
       <button type="submit" name="provider" value="@p.AuthenticationType" title="Log in using your @p.Caption account">@p.Caption</button> 
      } 
     </p> 
    </fieldset> 
} 

AccountController.cs

public class AccountController : Controller 
{ 
    ... 

    [AllowAnonymous] 
    [HttpPost] 
    public ActionResult ExternalLogin(string provider, string returnUrl) 
    { 
     return new ChallengeResult(provider, Url.Action("ExternalLoginCallback", "Account", new 
     { 
      loginProvider = provider, 
      ReturnUrl = returnUrl 
     })); 
    } 
    ... 
} 

ChallengeResult.cs:

public class ChallengeResult : HttpUnauthorizedResult 
{ 
    public ChallengeResult(string provider, string redirectUrl) 
    { 
     LoginProvider = provider; 
     RedirectUrl = redirectUrl; 
    } 

    public string LoginProvider { get; set; } 
    public string RedirectUrl { get; set; } 

    public override void ExecuteResult(ControllerContext context) 
    { 
     context.HttpContext.GetOwinContext().Authentication.Challenge(new AuthenticationProperties 
     { 
      RedirectUri = RedirectUrl 
     }, LoginProvider); 
    } 
} 

FilterConfig.cs

public class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new HandleErrorAttribute()); 

     // make all api controllers secure by default 
     filters.Add(new AuthorizeAttribute()); 
    } 
} 

risposta

8

scopre che il problema era che il mio progetto inizialmente nato come un'applicazione MVC 4, che aveva questo nel web.config la causa del problema:

<authentication mode="Forms"> 
    <forms loginUrl="~/Account/Login" timeout="2880" /> 
</authentication> 

Penso che entrambi OWIN e l'autenticazione Forms era attiva allo stesso tempo.

+0

questo davvero risolto per me! Grazie –

0

Ho lo stesso problema che si verifica quando aggiorno il nuget ASPNet.Web.Pages.Web.Data 3.1.1 a qualsiasi versione successiva. Con 3.1.1 è funzionante! Ho trovato la soluzione here.

0

Con l'aggiunta dell'autenticazione moduli, mi stavo reindirizzando alla pagina di accesso. Quindi, la rimozione di questo codice aiutato

<authentication mode="Forms"> 
    <forms loginUrl="~/Account/Login" timeout="2880" /> 
</authentication> 

ma ho dovuto aggiungere questa linea così

<system.webServer> 
    <validation validateIntegratedModeConfiguration="false" /> 
    <modules> 
     <remove name="FormsAuthentication" /> <-- added this line to remove it completely --> 
    </modules> 
</system.webServer> 

speranza che questo aiuta qualcuno.

Problemi correlati