varsayılan sağlayıcı olarak üyelik sağlayıcı Kayıt istersen yöntem e-posta değişikliğini ekleyebilir Muhtemelen aşağıdaki yolu izlerim:
İlk olarak, Entity Framework ile SimpleMembership veya bazı tabase bağlantısı (ADO, LINQ to SQL, vs.) iki bileşene sahip olacaksınız: WebSecurity.*
yöntem çağrıları ve profil değişiklikleri yapmak için veritabanı bağlantısı. Kişisel olarak, verilerinizin eksiksiz olduğundan emin olmak için CONSTRAINT
veritabanını ekleyebilirim, ancak bu mantığı da işleyen bir üyelik hizmeti de uygulayabilirsiniz. Kumandanızda başvurulabilir bir arayüz (gibi bir şey şu) için
Birincisi, grup bu:
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();
}
Sonra bir SimpleMembership ait hibrid ve veritabanı bağlantısı olarak hizmet uygulayabilir. Ben jenerik tutmak uğruna, ben IRepository<T>
desen kullanın, ancak bu doğrudan DbContext
, ObjectContext
, vb olabilir. Ben de kısa tutmak, eksik checksums ve kısa uygulama özür dilerim.
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
}
Artık denetleyicinizde bu arabirime başvurabilir ve mantığı tek bir yerde alabilirsiniz. Eğer bir DI konteyner kullanıyorsanız, belli ki bu kayıt, ama burada bir örnek uygulama: Eğer EntityFramework kullanıyorsanız
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);
}
/* ... */
}
, ayrıca IValidatableObject
kullanabilirsiniz. yinelenmesini direnmek için buraya benzersiz giriş için denetler başka SO soru/cevap: bu yeni bir veritabanı ise
Entity Framework IValidatableObject
, başka bir seçenek, bir kullanıcı adı olarak e-posta kullanmak olacaktır. kullanıcı adı varsayılan olarak benzersizdir. – Igarioshka