Трудно сказать без метода действия, но если он выглядит примерно так ...
[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, метод все равно будет вызываться дважды.