GetExternalLoginInfoAsync всегда возвращает null при попытке входа с помощью Facebook или Google

у меня проблема с OWIN проверка подлинности. Я всегда получаю значение null от GetExternalLoginInfoAsync() когда я пытаюсь войти в систему с помощью Facebook или Google.

но есть какой-то мистический случай.. Когда я открываю скрипач. Я получаю правильные данные, используя этот метод.

Я не могу понять причину

var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();

спасибо заранее!!

2 ответов


я решил свою проблему, добавив этот код

context.RequestContext.HttpContext.Response.SuppressFormsAuthenticationRedirect = true;

класс:

    private class ChallengeResult : HttpUnauthorizedResult
    {
        public ChallengeResult(string provider, string redirectUri)
            : this(provider, redirectUri, null)
        {
        }

        public ChallengeResult(string provider, string redirectUri, string userId)
        {
            LoginProvider = provider;
            RedirectUri = redirectUri;
            UserId = userId;
        }

        public string LoginProvider { get; set; }
        public string RedirectUri { get; set; }
        public string UserId { get; set; }

        public override void ExecuteResult(ControllerContext context)
        {
            // this line fixed the problem with returing null
            context.RequestContext.HttpContext.Response.SuppressFormsAuthenticationRedirect = true;

            var properties = new AuthenticationProperties() { RedirectUri = RedirectUri };
            if (UserId != null)
            {
                properties.Dictionary[XsrfKey] = UserId;
            }
            context.HttpContext.GetOwinContext().Authentication.Challenge(properties, LoginProvider);
        }
    }

это исправило мою проблему с возвращением NULL.

Примечание: не используйте fiddler при входе в систему с авторизацией twitter. Вы получите сообщение об ошибке.


вы должны очистить сеанс перед ExternalLoginCallback.

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult ExternalLogin(string provider, string returnUrl)
{
    ControllerContext.HttpContext.Session.RemoveAll();

    // Request a redirect to the external login provider
    return new ChallengeResult(provider, Url.Action("ExternalLoginCallback", "Account", new { ReturnUrl = returnUrl }));
}