2013-06-27 3 views
0

이것은 MVC 4 인터넷 응용 프로그램입니다. 역할 공급자 및 역할 관리자를 Web.config 파일의 SimpleRoleProvider 및 SimpleMembershipProvider로 설정했지만 "WebSecurity"클래스의 다른 메서드를 호출하기 전에 "WebSecurity.InitializeDatabaseConnection"메서드를 호출해야합니다. 전역, asax.cs 파일에서 WebSecurity.InitializeDatabaseConnection을 초기화 했음에도 예외입니다. 나는이 속성이 Authorized 속성의 Roles 속성이 프로그래밍 방식으로 완벽하게 작업을 생성하고 할당했기 때문에 이것이 제대로 초기화되었다는 것을 알고 있습니다. User UserName을 검색하여 잊어 버렸고 로그인 할 수없는 경우 이메일로 보내려고합니다. 감사합니다. 당신이 InitializeDatabaseConnection 전화 않았더라도SimpleMembershipProvider.GetUserNameByEmail 메서드를 사용하는 방법을 알 수 없습니다.

[HttpPost] 
    [CaptchaVerify("Captcha is not valid")] 
    [AllowAnonymous] 
    public ActionResult ForgotUserNameOrPassword(UserProfile model, FormCollection collection) 
    { 

     if (!ModelState.IsValid) 
     { 
      ViewBag.Error = "The Captcha answer is incorrect"; 
      return View(); 
     } 
     else 
     { 


      SimpleMembershipProvider mySMP = new SimpleMembershipProvider(); 

      int outRecs; 

      dynamic email = new Postal.Email("UserNameEmail"); 


      MembershipUserCollection myUserCol =mySMP.FindUsersByEmail(model.UserEmail, 0, 0, out outRecs); 

      email.Username = myUserCol; 
      email.To = model.UserEmail; 
      email.From = model.UserEmail; 
      email.Send(); 

      return View("../Account/Login"); 

     } 
    } 
+0

그런 식으로 SimpleMembershipProvider를 인스턴스화하지 마십시오. Memberhip.Provider라고 말하면 인스턴스화 된 공급자를 얻을 수 있습니다. 그러나 그 이상의 문제는 SimpleMembershipProvider가 이러한 메소드를 구현하지 않는다는 것입니다. 따라서 데이터베이스를 수동으로 쿼리하면됩니다. –

답변

1

는 제대로은 SimpleMembershipProvider.FindUsersByEmail 작동하지 않을 것입니다. 이 메서드에 대한 설명서의 참고 사항입니다.

SimpleMembershipProvider 클래스가 WebSecurity.InitializeDatabaseConnection() 메소드를 호출하여 초기화 되었으면,이 방법은 지원되지 않으며 NotSupportedException이 예외를 발생한다. 그러나 WebSecurity.InitializeDatabaseConnection() 메서드가 호출되지 않았고 표준 ASP.NET 멤버 자격 공급자를 사용하도록 사이트를 구성한 경우이 메서드는 표준 멤버 자격 공급자에게 전달됩니다. 자세한 내용은 SimpleMembershipProvider 클래스 개요를 참조하십시오.

당신이 겪고있는 것이 문서화 된 것은 아닙니다. 어디에서 예외가 던져 질 수 있습니까? FindUsersByEmail을 호출하면?

업데이트 6/28/13

SimpleMembershipProvider는 표준 공급자의 모든 메소드를 구현하지 않습니다. 방법이 없으면 몇 가지 옵션이 있습니다. 먼저 필요한 메서드가있는 원본에서 파생 된 사용자 지정 SimpleMembershipProvider를 만들 수 있습니다. 또는 필요한 메소드를 포함하도록 WebSecurity 클래스를 확장 할 수 있습니다. SimpleSecurity 오픈 소스 프로젝트 decouples SimpleMembership from the ASP.NET MVC application을보십시오. 이 article describes how to extend the WebSecurity class 및 데이터베이스를 직접 쿼리합니다. 특정 사용자를 이메일 주소로 유사하게 쿼리 할 수 ​​있습니다.

그러나 SimpleMembership은 사용자의 이메일 주소를 즉시 사용하는 것을 지원하지 않습니다. 이 article on how to customize SimpleMembership to include the email address을보십시오.

기본 멤버 자격 공급자가 전자 메일 주소에 대해 여러 사용자를 반환하는 이유는 전자 메일 주소가 동일한 전자 메일 주소로 사용되지 않는 한 동일한 스키마의 전자 메일 주소로 여러 계정을 열 수 없도록 제한한다는 것입니다. 사용자 이름.

+0

FindUsernameByEmail 호출이 처음부터 잘못되었습니다. 사용자에게 전자 메일을 보내려는 특정 Username이 아닌 Username 컬렉션을 가져 오기 때문입니다. model.UserEmail을 매개 변수로 전달하고 email.UserNmame으로 설정하여 Membership.GetUserNameByEmail 호출을 사용 중입니다. 내가 얻는 예외는 "지정된 메서드가 지원되지 않습니다."입니다. 이는 MembershipProvider에 속하는 메서드이기 때문입니다. SimpleMembershipProvider를 사용하려고하지만 Membership Provider의 일부 메소드에 액세스 할 수 있습니다. –

+0

Membership.GetUserByEmail()을 호출 할 때 예외가 발생합니다. –

+0

제 답변을 보시기 바랍니다. –