none
GetExternalLoginInfoAsync == null RRS feed

  • Вопрос

  • Подскажите, кто сталкивался, а многие сталкивались.

    В контроллере аккаунта есть событие ExternalLoginCallback, параметром в который передаётся строкой returnUrl, и в нём выполняется получение информации о внешнем входе через асинхронный вызов GetExternalLoginInfoAsync():

    [AllowAnonymous]
    public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
    {
    
    ExternalLoginInfo loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();
    
    if (loginInfo == null)
    return RedirectToAction("Login");
    
    //...
    }

    Буквально пару дней работало, сегодня перестало. Возможно, что-то обновил.

    returnUrl на входе null и loginInfo всегда null после отработки await, пробовал различные варианты: https, в студии, на сервере (свой хост), localhost, публичный домен.

    Как это оддебажить и найти конец - пока не могу разобраться.

    При этом в Интернете подобная проблема встречается с 2013 года, и ни у кого нет нормального объяснения. Кто-то открыл авторизацию на callback, кто-то на ядро Owin грешит.

    Как быть?



    30 марта 2017 г. 15:07

Ответы

  • В общем, выяснилось в чём дело.

    Метод GetExternalLoginInfoAsync не генерирует ошибок, в случае таковой возвращает значение null.

    А ошибки в этом методе могут появляться в том числе, если не будут в процессе аутентификации установлены два Claim`а.

    #region Обязательный Claim
    context.Identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, user_id, XmlSchemaString, Options.AuthenticationType));
    
    if (!string.IsNullOrEmpty(context.UserName))
    context.Identity.AddClaim(new Claim(ClaimsIdentity.DefaultNameClaimType, context.UserName, XmlSchemaString, Options.AuthenticationType));
    
    if (!string.IsNullOrEmpty(email))
    context.Identity.AddClaim(new Claim(ClaimTypes.Email, email, XmlSchemaString, Options.AuthenticationType));
    #endregion
    После определения данных частностей - взлетело.

    3 апреля 2017 г. 6:43

Все ответы

  • В общем выяснилось, что несколько дней назад Facebook переписал своё API, и оно не совместимо с версией OWIN 3.0.1, пришлось ставить 3.1.0-rc1.

    Что интересное, из пакета 3.1.0-rc1 не работает Microsoft Account, а также мой самописный пакет для vk.com.

    Кто в курсе, что происходит с OWIN?

    31 марта 2017 г. 7:52
  • В общем, выяснилось в чём дело.

    Метод GetExternalLoginInfoAsync не генерирует ошибок, в случае таковой возвращает значение null.

    А ошибки в этом методе могут появляться в том числе, если не будут в процессе аутентификации установлены два Claim`а.

    #region Обязательный Claim
    context.Identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, user_id, XmlSchemaString, Options.AuthenticationType));
    
    if (!string.IsNullOrEmpty(context.UserName))
    context.Identity.AddClaim(new Claim(ClaimsIdentity.DefaultNameClaimType, context.UserName, XmlSchemaString, Options.AuthenticationType));
    
    if (!string.IsNullOrEmpty(email))
    context.Identity.AddClaim(new Claim(ClaimTypes.Email, email, XmlSchemaString, Options.AuthenticationType));
    #endregion
    После определения данных частностей - взлетело.

    3 апреля 2017 г. 6:43
  • И куда этот код воткнуть?
    14 января 2018 г. 17:56
  • Это должно быть установлено в коде провайдера внешней авторизации.
    16 января 2018 г. 9:13