2012-10-12 21 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,所以對我來說這不是問題。

相關問題