Проверка подлинности с помощью форм Asp.Net Mvc вызывает двойной вызов - PullRequest
2 голосов
/ 11 января 2012

У нас есть новый проект, который в данный момент очень просту меня есть следующее:

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

Если это включено, действие для входа в систему вызывается дважды

Если я закомментирую это, оно вызывается только один раз?

1 Ответ

0 голосов
/ 29 апреля 2014

Трудно сказать без метода действия, но если он выглядит примерно так ...

[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. Если он не существует, то он циклически повторяется, добавляя текущий URL-адрес к значению в этой паре при втором запуске, фактически вызывая метод дважды.

Чтобы избежать этого, укажите в строке запроса действительную пару значений ключа ReturnUrl, как это ...

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

Обратите внимание, что ключ чувствителен к регистру. Например, если вы используете ReturnURL, метод все равно будет вызываться дважды.

...