Owin:多次调用 OnApplyRedirect 并创建不正确的 RedirectUri

Owin: OnApplyRedirect called several times and Create incorrect RedirectUri

我在带有 owin 的应用程序中使用 CookieAuthentication,并在 OnApplyRedirect 上设置重定向 url,如下代码所示:

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

我的问题是 c.RedirectUri 值,我设置断点并在执行此操作后跟踪我的代码 我明白 OnApplyRedirect 调用了服务器时间 .

在第一个调用中 RedirectUri 是:

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

在第二次调用中 RedirectUri 是:

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

还有更多...

在调用旧的 url 之前添加新的 url。 我尝试解决这个问题,在另一个和当前站点搜索和研究但没有找到答案,为什么 OnApplyRedirect 多次调用? Configuration Startup.cs 中的方法 class 只调用一次。 其他细节:

使用提供的身份验证,我能够通过在一个简单的自动生成的 OWIN 项目的 SignIn 操作上注释掉 [AllowAnonymous] 来重现该问题。

所以您的情况很可能是由于登录操作在用于匿名访问时需要身份验证,从而导致无限循环的重定向将失败。

在以下需要授权才能访问其管理面板的控制器中,会导致您遇到的问题。

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

所有登录、帐户验证和密码恢复操作都应使用 [AllowAnonymous] 属性进行标记,以便在 [Authorize] 控制器

内允许匿名访问
[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();
    }
}

或者应移动到未标记 [Authorize] 属性的控制器。

[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) {
        //...
    }
}