我在带有 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
?
Startup.cs
类中的Configuration
方法只会被调用一次。
其他细节:
- 欧文版本:3.1.0
- ASP.NET MVC 版本:5.x
Visual Studio 版本:2017 (15.2)
最佳答案
使用提供的身份验证,我能够通过在一个简单的自动生成的 OWIN 项目的 SignIn
操作上注释掉 [AllowAnonymous]
来重现该问题。
因此,您的情况很可能是由于登录操作在用于匿名访问时需要身份验证,从而导致无限循环的重定向将失败。
在以下 Controller 中,需要授权才能访问其管理面板会导致您遇到的问题。
[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]
Controller 内允许匿名访问
[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]
属性的 Controller 。
[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) {
//...
}
}
关于c# - Owin:多次调用 OnApplyRedirect 并创建不正确的 RedirectUri,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45504790/