Первая попытка внешнего входа перенаправляет обратно к действию входа, вторая работает

Я использую внешние поставщики аутентификации OWIN в своем проекте ASP.Net MVC 5 / WebApi 2 и столкнулся со странной проблемой.

Рабочий процесс входа в систему такой же, как здесь, на SO. Пользователь заходит на страницу входа, выбирает поставщика и входит в систему. Моя проблема заключается в том, что первый щелчок по поставщику перенаправляет обратно на ту же страницу входа:

http://localhost:57291/Account/Login?ReturnUrl=%2fAccount%2fExternalLogin

Это имеет смысл, если в действии ExternalLogin отсутствует атрибут AllowAnonymous.

Когда пользователь нажимает второй раз, все работает.

Я также пробовал это с разными браузерами, и проблема одинакова для Chrome, IE11 и Firefox.

Login.cshtml:

@using (Html.BeginForm("ExternalLogin", "Account", new { ReturnUrl = ViewBag.ReturnUrl }))
{
    <fieldset>
        <legend>@Strings.ExternalAuthenticationProvidersDescription</legend>
        <p>
            @foreach (var p in Model.ExternalAuthenticationProviders)
            {
                <button type="submit" name="provider" value="@p.AuthenticationType" title="Log in using your @p.Caption account">@p.Caption</button>
            }
        </p>
    </fieldset>
}

AccountController.cs

public class AccountController : Controller
{
  ...

    [AllowAnonymous]
    [HttpPost]
    public ActionResult ExternalLogin(string provider, string returnUrl)
    {
        return new ChallengeResult(provider, Url.Action("ExternalLoginCallback", "Account", new
        {
            loginProvider = provider, 
            ReturnUrl = returnUrl
        }));
    }
  ...
}

ChallengeResult.cs:

public class ChallengeResult : HttpUnauthorizedResult
{
    public ChallengeResult(string provider, string redirectUrl)
    {
        LoginProvider = provider;
        RedirectUrl = redirectUrl;
    }

    public string LoginProvider { get; set; }
    public string RedirectUrl { get; set; }

    public override void ExecuteResult(ControllerContext context)
    {
        context.HttpContext.GetOwinContext().Authentication.Challenge(new AuthenticationProperties
        {
            RedirectUri = RedirectUrl
        }, LoginProvider);
    }
}

FilterConfig.cs

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());

        // make all api controllers secure by default
        filters.Add(new AuthorizeAttribute());
    }
}

Ответы на вопрос(3)

Ваш ответ на вопрос