Я пытаюсь войти на свой сайт через 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