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



我在应用程序中使用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

还有更多...

在预调用旧网址中添加新网址。 我尝试解决这个问题,在另一个和当前站点中搜索和研究,但没有找到答案,为什么OnApplyRedirect多次打电话? 类ConfigurationStartup.cs方法只调用一次。 其他细节 :

  • 欧文版本:3.1.0
  • ASP.NET MVC 版本:5.x
  • Visual Studio 版本:2017 (15.2(

    简言中的启动类

使用提供的身份验证,我能够通过注释掉一个简单的自动生成的 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) {
//...
}
}

相关内容

  • 没有找到相关文章

最新更新