C# Google OAuth在通过Google注册新用户时抛出ArgumentNullException

C# Google OAuth在通过Google注册新用户时抛出ArgumentNullException,c#,asp.net-mvc-4,visual-studio-2012,oauth,C#,Asp.net Mvc 4,Visual Studio 2012,Oauth,在我们的MVC4应用程序中,我们使用标准的OAuth登录控件来登录Google。一旦用户登录Gmail并首次登录我们的网站,他就会被引导到ExternalLoginConfirmation屏幕。然后,用户可以选择与此帐户关联的用户名并提交表单 这段代码过去是可以工作的,但在工作过程中引入了一个错误。现在,当新的Google用户第一次登录并在输入用户名后单击submit时,会抛出以下错误(加上stacktrace): Value cannot be null. Parameter name: da

在我们的MVC4应用程序中,我们使用标准的OAuth登录控件来登录Google。一旦用户登录Gmail并首次登录我们的网站,他就会被引导到ExternalLoginConfirmation屏幕。然后,用户可以选择与此帐户关联的用户名并提交表单

这段代码过去是可以工作的,但在工作过程中引入了一个错误。现在,当新的Google用户第一次登录并在输入用户名后单击submit时,会抛出以下错误(加上stacktrace):

Value cannot be null.
Parameter name: data
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.ArgumentNullException: Value cannot be null.
Parameter name: data

Source Error:

Line 312:            string providerUserId = null;
Line 313:
Line 314:            if (User.Identity.IsAuthenticated || 
         !OAuthWebSecurity.TryDeserializeProviderUserId(model.ExternalLoginData, 
         out provider, out providerUserId))
Line 315:            {
Line 316:                return RedirectToAction("Manage");
使用以下堆栈跟踪:请参阅

代码blow是我们在ExternalLoginConfirmation控制器中使用的代码,也是标准代码:

// POST: /Account/ExternalLoginConfirmation

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult ExternalLoginConfirmation(RegisterExternalLoginModel model, 
     string returnUrl)
{
    string provider = null;
    string providerUserId = null;

    if (User.Identity.IsAuthenticated ||    
       !OAuthWebSecurity.TryDeserializeProviderUserId(model.
       ExternalLoginData, out provider, out providerUserId))
    {
        return RedirectToAction("Manage");
    }

    if (ModelState.IsValid)
    {
        // Insert a new user into the database
        using ( [project]Context db = new [project]Context())
        {
            User user = db.Users.FirstOrDefault(u => u.Name.ToLower() == 
                 model.UserName.ToLower());
         // Check if user already exists
             if (user == null)
             {
              // Insert name into the profile table
                    user = new User { Name = model.UserName };
                    db.Users.Add(user);
                    db.Schedules.Add(new Schedule { date = DateTime.Now, 
                                 UserId = user.UserId });
                    db.SaveChanges();                   

                    OAuthWebSecurity.CreateOrUpdateAccount(provider, 
                          providerUserId, model.UserName);
                    OAuthWebSecurity.Login(provider, providerUserId, 
                            createPersistentCookie: false);

                    return RedirectToLocal(returnUrl);
              }
              else
              {
                   ModelState.AddModelError("UserName", "Username already exists")
              }
          }
      }

      ViewBag.ProviderDisplayName = 
              OAuthWebSecurity.GetOAuthClientData(provider).DisplayName;
              ViewBag.ReturnUrl = returnUrl;
      return View(model);
 }
当我们查看版本控制时,它显示我们没有对RegisterExternalLoginModel进行调整,只是更改了错误消息:

public class RegisterExternalLoginModel
{
    [Required(ErrorMessage = "Username is mandatory.")]
    [Display(Name = "Name")]
    public string UserName { get; set; }

    public string ExternalLoginData { get; set; }
}
我们很乐意解决这个问题。我们对C#和MVC还很陌生,所以我们需要一些帮助!有人知道会出什么问题吗

(当然,如果需要更多的信息,我们当然可以根据要求提供,但由于我们不知道什么是相关的,我们现在就到此为止。)

/编辑额外信息

用户类如下所示:

public class User {
    public int UserId { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public bool isAvailable { get; set; }
}
创建了四个标准OAuth表,分别用于webpages\u成员资格、webpages\u OAuthMembership、webpages\u角色和webpages\u用户角色

调试时,语句中出现以下错误值:

User.Identity: System.Security.Principal.GenericIdentity
User.Identity.IsAuthenticated: false
model: RegisterExternalLoginModel
model.ExternalLoginData: null
provider: null
providerUserId: null
this: Controllers.AccountController

如果您的
IsAvailable
Email
字段不可为空,则使用当前代码注册新的OAuth用户将失败。你需要改变

user = new User { Name = model.UserName };
差不多

user = new User { Name = model.UserName, Email = model.Email, IsAvailable = model.IsAvailable };
如果按照您的建议更改了验证,您能否确认
外部登录确认
视图中有一个电子邮件字段和一个隐藏的
外部登录数据字段


(由于时间越来越长,将其从注释线程中删除)

您的用户配置文件类是什么样子的?另外,当您在错误发生之前进入代码时,您会看到空变量?@James我已经更新了问题。您的
外部登录确认
示例中缺少一个块(重要的一位)。您可以显示该方法的其余部分吗?
externalloginconconfiration
方法的一部分应该以
if(ModelState.IsValid)
开头。在该方法的该部分中,注册用户。我想知道是否缺少电子邮件地址或isAvailable值。电子邮件地址也没有,请查看源代码管理,查看模型何时更新,以及这是否与错误开始的时间有关。我希望在添加用户的行中有类似于
user=newuser{Name=model.UserName,Email=model.Email,IsAvailable=true}詹姆斯!我把文件还原到旧版本,现在它又能工作了。。。这可能是因为我改变了一些布局。谢谢你的帮助!!!有一些投票权;)