首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Google OAuth在通过Google注册新用户时抛出ArgumentNullException

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

Stack Overflow用户
提问于 2013-11-18 12:58:33
回答 1查看 323关注 0票数 0

在我们的MVC4应用程序中,我们使用标准的OAuth登录控件可以使用谷歌登录。一旦一个用户登录到Gmail和登录在我们的网站上,第一次,他被定向到ExternalLoginConfirmation屏幕。然后,用户可以选择与此帐户相关联的用户名并提交表单。

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

代码语言:javascript
复制
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");

使用以下堆栈跟踪:请参见这是堆栈追踪的要点

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

代码语言:javascript
复制
// 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进行任何调整:

代码语言:javascript
复制
public class RegisterExternalLoginModel
{
    [Required(ErrorMessage = "Username is mandatory.")]
    [Display(Name = "Name")]
    public string UserName { get; set; }

    public string ExternalLoginData { get; set; }
}

我们很乐意解决这个问题。我们对C#和MVC非常陌生,所以我们可以使用一些帮助!有谁知道什么是不对的吗?

(当然,如果需要更多的信息,我们当然可以根据要求提供信息,但由于我们不知道什么是相关的,所以现在就把它留在这里。)

/edit附加信息

User类如下所示:

代码语言:javascript
复制
public class User {
    public int UserId { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public bool isAvailable { get; set; }
}

并为webpages_Membership、webpages_OAuthMembership、webpages_Roles和webpages_UsersInRoles创建了四个标准的webpages_Roles表。

调试时,在出错的语句中有以下值:

代码语言:javascript
复制
User.Identity: System.Security.Principal.GenericIdentity
User.Identity.IsAuthenticated: false
model: RegisterExternalLoginModel
model.ExternalLoginData: null
provider: null
providerUserId: null
this: Controllers.AccountController
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-18 14:10:09

如果您的IsAvailableEmail字段不可为空,那么注册新的OAuth用户将失败。你需要改变

代码语言:javascript
复制
user = new User { Name = model.UserName };

到某种程度上

代码语言:javascript
复制
user = new User { Name = model.UserName, Email = model.Email, IsAvailable = model.IsAvailable };

如果您按照您的建议更改了验证,您能确认ExternalLoginConfirmation视图有一个电子邮件字段和一个用于ExternalLoginData的隐藏字段吗?

(随着时间的推移,将其从评论线程中移出)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20048404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档