Нулевой указатель .Net на SigninManager.ExternalSigninAsync

Я пытаюсь войти на свой сайт через Google, и часть входа в Google работает. Но когда я получаю информацию о пользователе от Google и она поступает в контроллер моей учетной записи, я получаю следующую ошибку:

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error: 


Line 336:            System.Diagnostics.Debug.WriteLine("loginInfo = " + loginInfo);
Line 337:            // Sign in the user with this external login provider if the user already has a login
Line 338:            var result = await SignInManager.ExternalSignInAsync(loginInfo, isPersistent: false);
Line 339:            switch (result)
Line 340:            {

Я пытаюсь понять, что это за нуль. Это не loginInfo, потому что отладчик в предыдущей строке сообщает мне, что:

loginInfo = Microsoft.AspNet.Identity.Owin.ExternalLoginInfo

Это также не SignInManager, так как это использовалось несколько раз в программе раньше без ошибок нулевого указателя. И result — это новая присваиваемая переменная, поэтому она также не может быть нулевой. Что вызывает эту ошибку?

Весь мой метод ExternalLoginCallback указан ниже, хотя это просто то, что автоматически создается Google.

   //
    // GET: /Account/ExternalLoginCallback
    [AllowAnonymous]
    public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
    {
        var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();
        if (loginInfo == null)
        {
            return RedirectToAction("Login");
        }
        System.Diagnostics.Debug.WriteLine("loginInfo = " + loginInfo);
        // Sign in the user with this external login provider if the user already has a login
        var result = await SignInManager.ExternalSignInAsync(loginInfo, isPersistent: false);
        switch (result)
        {
            case SignInStatus.Success:
                return RedirectToLocal(returnUrl);
            case SignInStatus.LockedOut:
                return View("Lockout");
            case SignInStatus.RequiresVerification:
                return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = false });
            case SignInStatus.Failure:
            default:
                // If the user does not have an account, then prompt the user to create an account
                ViewBag.ReturnUrl = returnUrl;
                ViewBag.LoginProvider = loginInfo.Login.LoginProvider;
                return View("ExternalLoginConfirmation", new ExternalLoginConfirmationViewModel { Email = loginInfo.Email });
        }
    }

Обратите внимание, что у других, у которых была похожая проблема, она возникла из-за того, что их API Google+ не был включен, но здесь это не так. Вот API, которые я включил:

BigQuery API    Disable 
Debuglet Controller API     Disable 
Google Cloud SQL    Disable 
Google Cloud Storage    Disable 
Google Cloud Storage JSON API   Disable 
Google+ API     Disable 
Tasks API   Disable 
YouTube Data API v3     Disable 

Обновление: кто-то предположил, что одно из свойств loginInfo может быть нулевым, но это также не так. Я расширил оператор отладки, чтобы перечислить все свойства loginInfo, и получил следующую информацию:

loginInfo email = <firstname>.<lastname>@<organization>.org
 external identity = System.Security.Claims.ClaimsIdentity
 login = Microsoft.AspNet.Identity.UserLoginInfo
 Default user name FirstLast

Обновление 2 Углубившись в свойства loginInfo, я узнал, что свойство ExternalIdentity.Actor имеет значение null, поэтому я думаю, что это проблема, но я до сих пор не знаю, почему.

Обновление 3. Я не думаю, что проблема с нулевым значением Актера, потому что я пробовал эту отладку с другим проектом, где вход в Google работает нормально, и там он также нулевой. Так что я до сих пор не знаю, что происходит.

Вот все свойства loginInfo:

loginInfo email = [email protected]
 externalidentity.actor = 
 externalidentity.claims = System.Security.Claims.ClaimsIdentity+<get_Claims>d__0
 externalidentity.bootstrapcontext = 
 authenticationtype = ExternalCookie
 loginprovider = Google
 loginkey = 103852334887708800511
 Default user name JimStewart

person jimboweb    schedule 20.04.2016    source источник


Ответы (1)


Я понял. loginInfo не было нулевым, это было SignInManager. Я никогда не создавал его в своем Startup.auth.cs. Если у вас возникла эта проблема, откройте этот файл, найдите метод ConfigureAuth и добавьте следующую строку:

app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);

На самом деле это тот же ответ, что и в этом вопросе: процесс аутентификации . Извините за дубликат; Я не нашел этого, когда искал ответ раньше.

person jimboweb    schedule 21.04.2016