2012-10-12 19 views
7

在此行中我得到一个例外 -MembershipCreateUserException - 提供的用户名无效

OAuthWebSecurity.CreateOrUpdateAccount(provider, providerUserId, model.UserName); 

System.Web.Security.MembershipCreateUserException:提供的用户名无效。

的数据进入,这是

  • 提供商 - “脸谱”
  • providerUserId - “1321311387573991”
  • model.UserName - “马克思·佩恩”

初始化工作正常使用

WebSecurity.InitializeDatabaseConnection("club", "User", "UserID", "UserName", autoCreateTables: true); 

我无法找到为什么它说用户名无效的任何示例? 是否有一个标准定义什么是正确的用户名?

+0

我认为用户名可能是电子邮件地址。至少这就是我登录Facebook时要求的。 –

回答

14

我也同样找一个解释这一点。我不确定我是否完全理解,但是在实验,调试和观察intellitrace事件之后,似乎CreateOrUpdateAccount使用Provider,ProviderUserId和UserId创建或更新OAuthMembership表中的条目,这是通过查询[在我的情况]基于这个唯一的UserName的UserProfile表。这样,如果您使用不同的提供程序和提供程序用户标识调用CreateOrUpdateAccount,但使用相同的用户名,则两个提供程序登录都绑定到应用程序中的相同用户帐户。

我必须添加一个UserProfile,然后才能创建/更新相应的OAuthMembership记录。在VS模板中,它看起来像这样:

db.UserProfiles.Add(new UserProfile { UserName = model.UserName }); 
db.SaveChanges(); 

OAuthWebSecurity.CreateOrUpdateAccount(provider, providerUserId, model.UserName); 
+0

这工作..谢谢。 – MoXplod

+0

此代码DID工作,但现在我已经介绍了'WebMatrix.WebData.WebSecurity',所以我必须使用'WebSecurity.CreateUserAndAccount(model.UserName,Guid.NewGuid()。ToString());'where Guid.NewGuid()是一个方便的随机密码 – ajd

-1

用户名也应该不会有像“马克思·佩恩”的空间

5

我有同样的问题。我通过在SimpleMembershipInitializer和UsersContext类中指定正确的连接字符串来解决它。我正在使用ASP.NET MVC4

1

这可能是因为您已经在另一个正在开发的站点上登录@ localhost。并且您使用相同的名称身份验证cookie(默认为.aspxauth)。因此,当您调用CreateOrUpdate时,它会尝试将另一个凭据添加到已经“注册”的配置文件中。但失败,因为它不在数据库中。

要解决此问题,您必须从浏览器中删除身份验证Cookie并重新登录。

0

根据MSDN(http://msdn.microsoft.com/en-us/library/82xx2e62.aspx),成员资格类不能支持用逗号或空格表示的用户名,空格也可以(因为不是ascii字符)。

的CREATEUSER方法将返回null如果密码是空字符串或空,用户名是空字符串或空或包含逗号(,),passwordQuestion不为空并且是空字符串,或passwordAnswer是不为null并包含空字符串。

0

对我来说,这个错误发生在我的种子覆盖。正如rgnever指出用户名不存在是引用UserProfile表。要修复此问题,必须在创建OAuth之前先创建用户和帐户。

因此,而不是我的种子只覆盖呼吁:

membership.CreateOrUpdateOAuthAccount(provider, providerid, providername); 

现在呼吁:

membership.CreateUserAndAccount(providername, null); 
membership.CreateOrUpdateOAuthAccount(provider, providerid, providername); 

注意:空口令意味着用户可以不通过登录表单登录,因为供应密码永远不会为空。我只使用OAuth,所以对我来说这不是问题。

相关问题