2014-04-29 3 views
8

Ich benutze die externen Authentifizierungsanbieter von OWIN in meinem ASP.Net MVC 5/WebApi 2 Projekt und ich habe ein seltsames Problem.Der erste externe Login-Versuch leitet zurück zur Login-Aktion, der zweite funktioniert

Der Login-Workflow ist genau wie hier auf SO. Benutzer trifft die Login-Seite, nimmt einen Anbieter und wird angemeldet Mein Problem ist, dass der erste Klick auf einen Anbieter leitet zurück zur gleichen Login-Seite.

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

Dieser Sinn machen würde, wenn die ExternalLogin Aktion würde fehlen das AllowAnonymous-Attribut.

Wenn der Benutzer ein zweites Mal klickt, funktioniert alles.

Ich habe das auch mit verschiedenen Browsern versucht und das Problem ist in Chrome, IE11 und Firefox konsistent.

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

Antwort

8

stellte sich heraus, das Problem war, dass mein Projekt zunächst als MVC 4 Applikation gestartet, die diesem das Problem verursacht in web.config hatte:

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

Ich denke, beide OWIN und die Formularauthentifizierung war zur gleichen Zeit aktiv.

+0

das hat es wirklich für mich repariert! Vielen Dank –

0

Ich habe das gleiche Problem, das auftritt, wenn ich das ASPNet.Web.Pages.Web.Data 3.1.1 nuget zu irgendwelchen späteren Versionen aktualisiere. Mit 3.1.1 funktioniert es! Ich habe die Lösung here gefunden.

0

Als die Formularauthentifizierung hinzugefügt wurde, wurde ich zur Anmeldeseite umgeleitet. Also, diesen Code zu entfernen half

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

aber ich hatte diese Zeile hinzufügen, wie gut

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

Hoffnung dies jemand hilft.

Verwandte Themen