c# - ASP.NET MVC:表 AspNetUserLogins 不记得数据
问题描述
AspNetUserlogins 表不记得数据。它应该记住用户通过外部登录(如 Facebook)注册时的数据。我已经使用 facebook 实现了外部登录,但出现了一些错误。有谁知道哪个方法/动作和哪个指令确切负责将数据保存到这个表中?这可能是来自帐户控制器的操作。
编辑:我发现它是帐户控制器中的 ExternalLoginConfirmation 操作。它在指令中给了我一个错误:
result = await UserManager.AddLoginAsync(user.Id, info.Login);
(必须是将用户添加到 AspNetUserLogin 表的行),这就是为什么我将它放在 try-catch 块中并解决了我的问题,但我认为它根本没有被执行。它只是不再给我验证错误。我认为它有问题,因为我从 facebook 请求更多数据,比如用户的名字。它可能更改了登录信息中的某些内容,并且无法将其添加到数据库中。或者可能是因为我在我的用户身份中添加了字段“名称”(用于名字)。
我的启动身份验证类:
var x = new FacebookAuthenticationOptions();
x.Scope.Add("email");
x.AppId = "2737863089761791";
//x.Scope.Add("public_profile");
x.AppSecret = "";
x.UserInformationEndpoint = "https://graph.facebook.com/v2.8/me?fields=id,name,email,first_name,last_name";
x.Provider = new FacebookAuthenticationProvider()
{
OnAuthenticated = async context =>
{
context.Identity.AddClaim(new System.Security.Claims.Claim("FacebookAccessToken", context.AccessToken));
foreach (var claim in context.User)
{
var claimType = string.Format("urn:facebook:{0}", claim.Key);
string claimValue = claim.Value.ToString();
if (!context.Identity.HasClaim(claimType, claimValue))
context.Identity.AddClaim(new System.Security.Claims.Claim(claimType, claimValue, "XmlSchemaString", "Facebook"));
}
}
};
x.SignInAsAuthenticationType = DefaultAuthenticationTypes.ExternalCookie;
app.UseFacebookAuthentication(x);
(我从 facebook 请求一些字段,比如名字)。我删除了应用程序机密。
我的ExternalLoginConfirmation
方法:
[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.Email, Email = model.Email , Name = model.Name};
var result = await UserManager.CreateAsync(user);
if (result.Succeeded)
{
try
{
var useraux = await UserManager.FindByEmailAsync(model.Email);
result = await UserManager.AddLoginAsync(useraux.Id, info.Login);
}
catch (DbEntityValidationException e)
{
foreach (var eve in e.EntityValidationErrors)
{
Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
eve.Entry.Entity.GetType().Name, eve.Entry.State);
Response.Write("Object: " + eve.Entry.Entity.ToString());
Response.Write(" " +
"");
foreach (var ve in eve.ValidationErrors)
{
Console.WriteLine("- Property: \"{0}\", Error: \"{1}\"",
ve.PropertyName, ve.ErrorMessage);
Response.Write(ve.ErrorMessage + "" +
"");
}
}
//throw;
}
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);
}
解决方案
推荐阅读
- xml - 如何在 Symfony 中动态创建实体类
- python - jupyter notebook 之间的自定义消息
- android - API 19:网络安全策略不允许明文通信
- python - 在 Python 中绘制连接点的 xy 网格
- amazon-sagemaker - 如何在 AWS SageMaker 中为超参数调整作业设置种子以实现重现性
- python - 为什么我不能使用 Visual Studio Code 为这个 Django 项目启用 Pylint?
- python - 使用多个分隔符拆分多个列;新形成的列应该有原始值的计数
- android - 如何在 Android 10 中的屏幕锁定屏幕时启动活动
- amazon-web-services - 我很困惑如何使用 Amazon Cognito 用户池控制 API Gateway Rest API 中的访问
- python - 我可以通过 python API 在 Dialogflow CX 中获取所有 Route Fulfillment 消息吗?