【发布时间】:2021-01-02 23:15:10
【问题描述】:
我向我的用户添加了一个新字段:“姓名”(因为我看到 UserName 与电子邮件具有相同的值,所以我不想更改它)。出于某种原因,我无法在 Facebook 注册新用户。带来错误的行是“result = await UserManager.AddLoginAsync(useraux.Id, info.Login);”在 ExternalLoginConfirmation 中,所以我认为 user.Id 在将所有用户信息插入用户表之前可能没有任何价值,所以我在用户放入表后等待,然后通过电子邮件选择它以获取其 ID,但它仍然给我错误。当我向 Facebook 请求更多数据(用户名)时,我认为我破坏了外部登录;为此,我不得不对代码进行一些更改。我在 ExternalLoginCallback 中添加了以下行以获取名字:“var firstName = loginInfo.ExternalIdentity.Claims.First(c => c.Type == "urn:facebook:first_name").Value;"
我的代码:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> ExternalLoginConfirmation(ExternalLoginConfirmationViewModel model, string returnUrl)
{
if (User.Identity.IsAuthenticated)
{
return RedirectToAction("Index", "Manage");
}
if (ModelState.IsValid)
{
// Get the information about the user from the external login provider
var info = await AuthenticationManager.GetExternalLoginInfoAsync();
if (info == null)
{
return View("ExternalLoginFailure");
}
var user = new ApplicationUser { UserName = model.Name, Email = model.Email , Name = model.Name};
var result = await UserManager.CreateAsync(user);
if (result.Succeeded)
{
var useraux = await UserManager.FindByEmailAsync(model.Email);
result = await UserManager.AddLoginAsync(useraux.Id, info.Login);
if (result.Succeeded)
{
//--
//await StoreFacebookAuthToken(user);
await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
return RedirectToLocal(returnUrl);
}
}
AddErrors(result);
}
ViewBag.ReturnUrl = returnUrl;
return View(model);
}
[AllowAnonymous]
public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
{
var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();
var firstName = loginInfo.ExternalIdentity.Claims.First(c => c.Type == "urn:facebook:first_name").Value;
if (loginInfo == null)
{
return RedirectToAction("Login");
}
// 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, Name = firstName });
}
}
编辑:我在 try-catch 块中添加了导致错误的行,它应该将类似“Console.WriteLine(”) 的错误写入控制台状态“{1}”中的“{0}”类型实体有以下验证错误:“”,我到底应该看吗?通过右键单击和“检查”打开的控制台中没有任何内容,并且在 Visual Studio 中什么都不是。但是,它以某种方式解决了我的问题,并且我不再收到错误了。
【问题讨论】:
-
“有关更多详细信息,请参阅 'EntityValidationErrors' 属性” - 是否查看了有关异常的
EntityValidationErrors集合?如果没有,为什么不呢? -
Entity Framework 抛出异常,与 Claims 或 Facebook 无关。
标签: c# asp.net-mvc