2017-08-04 2 views
4

Ich benutze CookieAuthentication in meiner Anwendung mit owin und URL umleiten setzen auf OnApplyRedirect wie dem folgenden Code:Owin: OnApplyRedirect mehrfach aufgerufen und erstellen eine falsche RedirectUri

app.UseCookieAuthentication(new CookieAuthenticationOptions 
{ 
    ExpireTimeSpan = TimeSpan.FromDays(30), 
    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
    LoginPath = new PathString("/account/sign-in"), 
    //LogoutPath = new PathString("/account/log-out"), 
    ReturnUrlParameter = "returnTo", 
    CookieName = "BIR", 
    Provider = new CookieAuthenticationProvider() 
    { 
     OnValidateIdentity = SmObjectFactory.Container.GetInstance<IAppUserManager>().OnValidateIdentity(), 
     OnApplyRedirect = c => 
     { 
      if (!c.Request.IsAjaxCall()) 
      { 
       c.Response.Redirect(c.RedirectUri); 
      } 
     } 
    } 
}); 

mein Problem ist c.RedirectUri Wert, i gesetzt Pause zeigen und verfolgen Sie meinen Code nach dies verstehe ich, dass OnApplyRedirectgenannt mehrere Male.

im ersten Aufruf RedirectUri ist:

http://localhost:7537/account/sign-in?returnTo=%2Fadmin-panel

Im zweiten Aufruf RedirectUri ist:

http://localhost:7537/account/sign-in?returnTo=%2Faccount%2Fsign-in%3FreturnTo%3D%252Fadmin-panel

und mehr ...

In Pre-Call alte URL neue URL hinzufügen. Ich versuche, dieses Problem zu lösen, suchen und recherchieren in einer anderen und aktuellen Website, aber keine Antwort finden, warum OnApplyRedirect mehrere Male anrufen? Configuration Methode in Startup.cs Klasse Nur einmal aufgerufen wird. andere Details:

+2

Nur um sicherzustellen, dass '/ account/sign-in' keine Authentifizierung erfordert. , d.h. es ist mit '[AllowAnonymous]' dekoriert – Albert

Antwort

2

Mit der bereitgestellten Auth in, konnte ich das Problem reproduzieren, indem Sie die auf derkommentierenAktion eines einfach automatisch generierten OWIN-Projekts.

Es besteht also die Möglichkeit, dass Ihre Situation darauf zurückzuführen ist, dass die Anmeldung eine Authentifizierung erfordert, während sie für den anonymen Zugriff verwendet wird, was zu einer Endlosschleife von Weiterleitungen führt, die fehlschlägt.

In dem folgenden Controller, bei dem eine Autorisierung für den Zugriff auf das Admin-Steuerfeld erforderlich ist, würde das Problem auftreten.

[Authorize] 
[RoutePrefix("account")] 
public class AccountController : Controller { 
    [Route("sign-in")]   
    public ActionResult Signin(string returnTo) {    
     ViewBag.ReturnTo = returnTo; 
     return View(new LoginViewModel { RememberMe = true }); 
    }  

    [Route("admin-panel")] 
    public Action AdminPanel() { 
     return View(); 
    } 
} 

Alle Anmelden, Kontoüberprüfung und Passwort-Recovery-Aktionen mit [AllowAnonymous] Attribut sollte markiert den anonymen Zugriff zu ermöglichen, wenn sie

[Authorize] 
[RoutePrefix("account")] 
public class AccountController : Controller { 
    [AllowAnonymous] 
    [Route("sign-in")]   
    public ActionResult Signin(string returnTo) {    
     ViewBag.ReturnTo= returnTo; 
     return View(new LoginViewModel { RememberMe = true }); 
    } 

    [HttpPost] 
    [AllowAnonymous] 
    [ValidateAntiForgeryToken] 
    [Route("sign-in")] 
    public async Task<ActionResult> Signin(LoginViewModel model, string returnTo) { 
     //... 
    } 

    [Route("admin-panel")] 
    public Action AdminPanel() { 
     return View(); 
    } 
} 

innerhalb [Authorize] Controller sind oder sollten Controller bewegt werden, die nicht markiert sind mit [Authorize] Attribut.

[Authorize] 
public class AccountController : Controller { 
    [Route("account/admin-panel")] 
    public Action AdminPanel() { 
     return View(); 
    } 
} 

public class AuthenticationController : Controller { 
    [Route("account/sign-in")]   
    public ActionResult Signin(string returnTo) {    
     ViewBag.ReturnTo= returnTo; 
     return View(new LoginViewModel { RememberMe = true }); 
    } 

    [HttpPost] 
    [ValidateAntiForgeryToken] 
    [Route("account/sign-in")] 
    public async Task<ActionResult> Signin(LoginViewModel model, string returnTo) { 
     //... 
    } 
} 
Verwandte Themen