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

标签 c# asp.net-mvc asp.net-identity owin redirect

我在带有 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。 我试图解决这个问题,在另一个和当前站点搜索和研究但没有找到答案,为什么多次调用 OnApplyRedirectStartup.cs 类中的Configuration 方法只会被调用一次。 其他细节:

最佳答案

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

相关文章:

c# - 加密 SqlDependency 创建的存储过程

C# 构造函数使用私有(private)/公共(public)字段

c# - 在 ASP.NET Identity 2.0 中获取当前用户 ID

asp.net-mvc - ExternalSignInAsync - 它什么时候返回 SignInStatus.RequiresVerification?

c# - COM C#,如何用C++调用COM

c# .net 更改标签文本

c# - 按枚举描述排序

asp.net-mvc - Entity Framework 将 s 添加到我的 .dbo

c# - 更新 ASP.NET One Core 中的声明值

c# - 无法使用 EFCore、EntityState.Modified : "Database operation expected to affect 1 row(s) but actually affected 0 row(s)." 编辑数据库条目