问题描述
我对 ExternalLogin 操作进行了一些更改。我在我的用户表中添加了一个新字段,作为名字,并添加了代码以从 facebook 请求名字。这可能是我收到错误的原因。我不会在这里发布用于 facebook 外部登录的应用程序机密,但您知道它存在于我的代码中。当我向 facebook 注册一个新用户时,它会工作并保持用户登录状态,并将用户添加到数据库中,也会得到正确的名字。但是,当我注销并尝试使用 facebook 登录时,它会强制我注册而不是登录(它重定向到使用 facebook 页面的注册,说“您已成功通过 facebook 进行身份验证。请输入此站点的用户名”并单击注册按钮完成登录。”) 这是我所做更改的代码: 在 Startup.Auth 类中:
app.UseFacebookAuthentication(new FacebookAuthenticationoptions()
{
AppId = "2737863089761791",AppSecret = "",BackchannelHttpHandler = new httpclienthandler(),UserinformationEndpoint = "https://graph.facebook.com/v2.8/me?fields=id,name,email,first_name,last_name",Scope = { "email" },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"));
}
}
}
});
在我的 AccountController 中的 ExternalLoginCallback 操作中:
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 });
}
var result = await SignInManager.ExternalSignInAsync(loginInfo,isPersistent: false);
在 ExternalLoginCallback 内部返回失败,我不知道为什么。它必须返回成功才能进入案例:
case SignInStatus.Success
我的 ExternalLoginConfirmation 操作出错,所以我将一些代码放在 try-catch 块中。它解决了我的问题,但我仍然不知道错误来自哪里:
[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)
{
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);
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)