我真的刚刚开始接触这个MVC和ASP.NET LinkedIn,所以请耐心听我说。我正在尝试对我的用户进行身份验证,这似乎是有效的,但是当我尝试存储accessToken值(它似乎也是有效的)时,我得到了错误:
“异常详细信息:找不到System.InvalidOperationException: UserId。”
错误出现在注释"// error occurs“
public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
{
var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();
if (loginInfo == null)
{
return RedirectToAction("Login");
}
var claimsIdentity = await AuthenticationManager.GetExternalIdentityAsync(DefaultAuthenticationTypes.ExternalCookie);
if (claimsIdentity != null)
{
var userIdClaim = claimsIdentity.Claims.FirstOrDefault(x => x.Type == ClaimTypes.NameIdentifier);
if (userIdClaim != null)
{
// userIdClaim.Value here is: 5-0Vfh4Gv_
var accessToken = claimsIdentity.FindAll(loginInfo.Login.LoginProvider + "_AccessToken").First();
if (accessToken != null)
{
// gets to this point, but...
await UserManager.AddClaimAsync(userIdClaim.Value, accessToken); // ERROR OCCURS HERE
}
}
}
... ... ...
}此代码99%来自Visual Studio中的MVC应用程序模板。我所做的唯一改变是添加了linkedin包( NuGet - package linkedin),并在Startup.Auth.cs中设置了我的API密钥/密钥。完全有可能(甚至很可能)我只是做了一些乱七八糟的事情,或者错误地获取了用户ID。
我已经看了我能找到的每一个例子和视频,但仍然不能解决这个问题。
有没有人可以帮我处理这个用户错误消息,还有,我是不是错过了一些通用的最佳实践之类的东西?感到迷失和沮丧。
谢谢!
发布于 2015-09-09 09:34:41
错误消息说明了一切。我认为您没有正确获取用户Id。
试一试
await UserManager.AddClaimAsync(claimsIdentity.GetUserId(), accessToken);而不是
await UserManager.AddClaimAsync(userIdClaim.Value, accessToken);发布于 2015-09-09 09:51:11
问题是在这一点上:
await UserManager.AddClaimAsync(userIdClaim.Value, accessToken);第一个参数应为身份数据库表中用户的UserId (即aspnetusers)。
您正在从LinkedIn传入nameidentifer -因此,该用户在您的数据库中不存在。
我认为您需要首先检查外部用户是否已经注册,如果没有,则创建帐户,添加外部登录,然后添加声明。
https://stackoverflow.com/questions/32469535
复制相似问题