2010-01-10 105 views
1

我爲我的ASP.NET MVC應用程序實現了一些基本的自定義成員資格提供程序,所以我認爲所有的驗證都將在我的自定義代碼中完成。ASP.NET MVC自定義成員資格提供程序「CreateUser」

不幸的是,當我試圖通過調用函數來創建新的用戶:

Membership.CreateUser(user.UserName, user.Password, user.Email, null, null, true, Guid.NewGuid(), out status); 

它將最終引發異常,並所有驗證錯誤我越來越喜歡「InvalidUserName」或「InvalidPassword狀態「相反......這意味着我的自定義CreateUser函數不是直接調用,而是在我想跳過的一些基本驗證之後使用。

我CREATEUSER功能(在我的定義提供):

public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status) 
{ 
    try 
    { 

     User user = new User(); 
     user.UserKey = Guid.NewGuid(); 
     user.UserName = username; 
     user.passwordSalt = string.Empty; 
     user.Password = this.TransformPassword(password, ref user.passwordSalt); 
     user.Email = email; 
     user.PasswordQuestion = passwordQuestion; 
     user.PasswordAnswer = passwordAnswer; 
     user.CreationDate = DateTime.Now; 
     user.LastActivityDate = DateTime.Now; 
     user.LastLoginDate = DateTime.MinValue; 
     user.LastPasswordChangeDate = DateTime.Now; 

     this._UsersRepository.SaveUser(user); 

     status = MembershipCreateStatus.Success; 
     return CreateMembershipFromInternalUser(user); 


    } 
    catch(RuleException ex) 
    { 
     throw ex; 
    } 
} 

你知道如何執行自定義功能CREATEUSER直接使用!?


但我不使用默認的ASP.NET MVC項目的AccountController ...

只要看看:

[AcceptVerbs(HttpVerbs.Post)] 
public ViewResult Register(User user, string password_confirm, bool acceptsTerms) 
{ 
    if (!acceptsTerms) 
     ModelState.AddModelError("acceptsTerms", "Musisz zaakceptować regulamin"); 

    if (ModelState.IsValid) 
    { 
     try 
     { 
      MembershipCreateStatus status = new MembershipCreateStatus(); 
      Membership.CreateUser(user.UserName, user.Password, user.Email, null, null, true, Guid.NewGuid(), out status); 
     } 
     catch (RuleException ex){ 
      ex.CopyToModelState(ModelState,"user"); 
     } 
    } 

    return View(); 
} 

的一點是,我得到一個狀態當user.UserName或user.Password爲空時,而不是RuleException ex。我的自定義RuleException ex也會讓我回到這些信息。在哪裏狀態值現在被分配! Bacouse它不是在我的實現CREATEUSER的...

回答

0

完全重寫

做ASP.NET成員資格系統總是這樣的投入一些初步驗證API,例如CREATEUSER被調用時。

我不知道任何解決這個問題的方法,而不是直接轉到ASP.NET成員資格API。

+0

好的,謝謝你...... – Kotu 2010-01-10 22:28:53

2

我使用這個(MVC3),我覺得沒有問題:

[HttpPost] 
public ActionResult Register(RegisterModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     MembershipCreateStatus status; 
     Membership.Provider.CreateUser(model.UserName, model.Password, model.Email, "", "", true, Guid.NewGuid(), out status); 

     if (status == MembershipCreateStatus.Success) 
     { 
      FormsService.SignIn(model.UserName, false); 
      return RedirectToAction("Index", "Home"); 
     } 
     else 
     { 
      ModelState.AddModelError("", AccountValidation.ErrorCodeToString(status)); 
     } 
    } 

    // If we got this far, something failed, redisplay form 
    ViewBag.PasswordLength = MembershipService.MinPasswordLength; 
    return View(model); 
} 
+0

+ 1,對於一個MVC3項目,通過Membership.Provider訪問我的自定義提供程序對我來說也是完美的。 – 2011-08-29 17:22:04

1

使用ILSpy查看靜態方法Membership.CreateUser,你會發現它完成

  • 用戶名驗證(修剪空白+非空,非空)
  • 密碼(修剪空白+非空,非空,長度檢查)
  • 電子郵件(修剪空白)
  • 密碼問題(裝飾空格+不爲空)
  • 密碼提示答案(修剪空格+不爲空)

然後調用自定義提供。

這裏的關鍵是不要直接通過調用靜態方法CREATEUSER

Membership.CreateUser(...) 

相反,調用自定義提供商:

Membership.Provider.CreateUser(...) 

測試和驗證工作,爲.NET 4

雖然我的網站建議有密碼,但我們支持openid。所以強迫用戶輸入密碼似乎與openid的優點相反。

相關問題