ASP.NET MVC窗体认证导致登录网址被调用两次。

问题描述 投票:3回答:1

我们有一个新的项目,目前是非常原始的。

我正在设置表单认证,并有以下视图。

views/home/index.cshtml
views/logon/index.cshtml

而在我的 web.config 我有以下的情况。

<authentication mode="Forms">
  <forms loginUrl="~/LogOn/Dev" />
</authentication>

如果启用这个功能,登录的动作会被调用两次。

如果我把它注释掉,它只被调用一次?

有什么好办法吗?

asp.net-mvc asp.net-mvc-3 forms-authentication
1个回答
0
投票

如果没有动作方法,很难说清楚,但如果它看起来像这样...

[AllowAnonymous]
        public ActionResult External()
        {
            var authentication = HttpContext.GetOwinContext().Authentication;
            if (Request.HttpMethod == "POST")
            {
                foreach (var key in Request.Form.AllKeys)
                {
                    if (key.StartsWith("submit.External.") && !string.IsNullOrEmpty(Request.Form.Get(key)))
                    {
                        var authType = key.Substring("submit.External.".Length);
                        authentication.Challenge(authType);
                        return new HttpUnauthorizedResult();
                    }
                }
            }
            var identity = authentication.AuthenticateAsync("External").Result.Identity;
            if (identity != null)
            {
                authentication.SignOut("External");
                authentication.SignIn(
                    new AuthenticationProperties { IsPersistent = true },
                    new ClaimsIdentity(identity.Claims, "Application", identity.NameClaimType, identity.RoleClaimType));
                return Redirect(Request.QueryString["ReturnUrl"]);
            }

            return View();
        }

... 然后HttpUnauthorizedResult()被调用,这个方法寻找一个ReturnUrl查询字符串keyvalue对。如果它不存在,那么它就会再次循环,在第二次运行时将当前的URL附加到该对的值上,实际上是两次调用该方法。

为了避免这种情况,在查询字符串中提供一个有效的ReturnUrl键值对,就像这样......

<a href="/Account/Login?ReturnUrl=@ViewContext.HttpContext.Request.Url.PathAndQuery">Login to Your App</a>

注意,键值是区分大小写的。例如,如果你使用ReturnURL,方法仍然会被调用两次。

© www.soinside.com 2019 - 2024. All rights reserved.