의 기본 공급자로 당신의 멤버 자격 공급자를 등록합니다 원하는 방법 이메일 변경을 추가 할 수 있습니다 아마도 다음과 같은 방식으로 진행할 것입니다.
먼저 Entity Framework에서 SimpleMembership을 사용한다고 가정하면 tabase 연결 (ADO, LINQ to SQL 등)에는 두 가지 구성 요소 (WebSecurity.*
메서드 호출)와 데이터베이스 연결을 사용하여 프로필을 변경합니다. 개인적으로 데이터가 순수하다는 것을 확인하기 위해 CONSTRAINT
을 데이터베이스에 추가하지만이 논리를 처리하는 멤버십 서비스도 구현할 수 있습니다. 컨트롤러에서 참조 할 수있는 인터페이스 (같은 아래)에있는
첫째, 그룹 이러한 :
public interface IMembershipService
{
Int32 CurrentUserId { get; }
String CurrentUserName { get; }
Boolean IsAuthenticated { get; }
Boolean CreateUserAndAccount(String username, String password, String emailaddress = null);
Boolean CreateUserAndAccount(String username, string password, out String confirmationToken, String emailaddress = null);
Boolean Login(String username, String password, Boolean persistCookie = false);
void Logout();
}
그런 다음 당신은 SimpleMembership의 하이브리드 및 데이터베이스 연결 등의 서비스를 구현할 수 있습니다. 일반적으로 유지하기 위해 IRepository<T>
패턴을 사용하지만 직접 DbContext
, ObjectContext
등이 될 수 있습니다. 또한 간략하게 유지하므로 누락 된 체크섬 및 짧은 구현을 고려해야합니다.
public class MembershipService : IMembershipService
{
protected readonly SimpleMembershipProvider membershiProvider;
protected readonly SimpleRoleProvider roleProvider;
protected readonly IRepository<UserProfile> profileRepository;
public MembershipService(IRepository<UserProfile> profileRepository)
{
this.membershipProvider = Membership.Provider as SimpleMembershipProvider;
this.roleProvider = Role.Provider as SimpleRoleProvider;
this.profileRepository = userRepository;
}
#region IMembershipService Implementation
public Int32 CurrentUserId
{
get { return WebSecurity.CurrentUserId; }
}
public String CurrentUserName
{
get { return WebSecurity.CurrentUserName; }
}
public Boolean IsAuthenticated
{
get { return WebSecurity.IsAuthenticated; }
}
public Boolean CreateUserAndAccount(String username, String password, String emailaddress = null)
{
// validate the email address is unique
if (!this.profileRepository.Any(x => x.EmailAddress == emailaddress))
{
WebSecurity.CreateUserAndAccount(username, password, new
{
EmailAddress = emailaddress
}, createConfirmationToken);
return true;
}
else
{
// handle the error how you see fit
// (maybe even exception?)
return false;
}
}
public Boolean CreateUserAndAccount(String username, String password, out String confirmationToken, String emailaddress = null, out)
{
// validate the email address is unique
if (this.profileRepository.First(x => x.EmailAddress == emailaddress) == null)
{
confirmationToken = WebSecurity.CreateUserAndAccount(username, password, new
{
EmailAddress = emailaddress
}, createConfirmationToken);
return true;
}
else
{
// handle the error how you see fit
// (maybe even exception?)
confirmationToken = String.Empty;
return false;
}
}
public Boolean Login(String username, String password, Boolean persistCookie = false)
{
return WebSecurity.Login(username, password, persistCookie);
}
public void Logout()
{
WebSecurity.Logout();
}
#endregion
}
이제이 인터페이스를 컨트롤러에서 참조하고 로직을 한 곳에서 사용할 수 있습니다. 당신이 DI 컨테이너를 사용하는 경우, 분명히을 등록하지만, 여기에 구현 한 예이다 : 당신이 EntityFramework를 사용하는 경우
public class AccountController: Controller
{
private readonly IMembershipService membershipService;
public AccountController(IMembershipService membershipService)
{
this.membershipService = membershipService;
}
/* ... */
[HttpPost, ValidateAntiForgeryToken]
public ActionResult Register(LoginViewModel model, String returnUrl)
{
if (ModelState.IsValid)
{
if (this.membershipService.CreateUserandAccount(model.Username, model.Password, model.EmailAddress))
{
this.membershipService.Login(model.Username, model.Password);
if (!String.IsNullOrEmpty(returnUrl) && Url.IsLocalUrl(returnUrl))
{
return Redirect(returnUrl);
}
return RedirectToRoute("Default");
}
else
{
ModelState.AddModelError("", "Unable to register.");
}
}
return View(model);
}
/* ... */
}
, 당신은 또한 IValidatableObject
를 사용할 수 있습니다. 복제에 저항하기 위해, 여기에 고유 항목에 대한 검사 다른 SO 질문/대답 :이 새 데이터베이스의 경우
Entity Framework IValidatableObject
, 또 다른 옵션은 사용자 이름으로 이메일을 사용하는 것입니다. 사용자 이름은 기본적으로 고유합니다. – Igarioshka