Entity framework 定制会员服务提供商&;MVC4
继续此解决方案: 我宣布Entity framework 定制会员服务提供商&;MVC4,entity-framework,dependency-injection,asp.net-mvc-4,ninject,membership-provider,Entity Framework,Dependency Injection,Asp.net Mvc 4,Ninject,Membership Provider,继续此解决方案: 我宣布 public interface IUserRepository : IRepository<UserModel> { MembershipUser CreateUser(string username, ... , string providername = null); void Logout(); Boolean Login(string userName, string Password, bool persistCookie = false);
public interface IUserRepository : IRepository<UserModel>
{
MembershipUser CreateUser(string username, ... , string providername = null);
void Logout();
Boolean Login(string userName, string Password, bool persistCookie = false);
bool RegisterUser(UserModel user);
}
4.Web.config作为因此,您有CustomMembershipProvider.CreateUser和UserRepository.CreateUser。 您的控制器正在直接调用UserRepository.CreateUser,但我认为您确实想调用CustomMembershipProvider.CreateUser 您的控制器正在呼叫
public bool RegisterUser(UserModel user)
{
MembershipCreateStatus createStatus;
CreateUser(user.UserName, user.Password, user.Email, user.PasswordQuestion, user.PasswordAnswer, user.IsApproved, null, out createStatus, ...);
这反过来又在召唤你
public MembershipUser CreateUser(string username, ... , string providername = null)
但是,据我所知,您正在为提供者名称传递NULL
您真正想要的是将其拆分为一个MembershipService,您可以将其注入控制器中
我不能给你一个简单的“改变这一行”的答案,这个问题是概念性的,对不起。您可以传递一个硬编码的providername,但随后确实开始违反所有规则。在Web.Config中,类似这样的内容。。。。您告诉会员资格提供者和提供者使用。 在本例中,您的自定义提供程序。 但是我不知道为什么ninject在这个概念中扮演了一个角色,所以在这方面我无能为力。 客户提供商必须知道自己的名称。但这几乎不是问题。 Web.config具有自定义提供程序的名称。所以配置不是硬编码的
<membership defaultProvider="YourProvider" userIsOnlineTimeWindow="5">
<providers>
<!--attribute names in camelCase version of .net class MembershipProvider Properties. http://msdn.microsoft.com/en-us/library/system.web.security.membership_properties
See BOS class for constants : BOSSysConst
type = Implmenting provider class namespace.Classname
How to configure membership providers... http://msdn.microsoft.com/en-us/library/6e9y4s5t -->
<add name="YourProvider"
type="YourNamespace.YourProvider"
connectionStringName="YourConnectionString"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="true"
passwordFormat="Hashed"
applicationName="IMPORTANT" />
</providers>
</membership>
我已经将
IUserRepository
注入控制器,并通过Ninject
对其进行配置。那么我还需要配置什么?我想你是想调用CustomMembershipProvider.CreateUser。但实际上您是直接调用UserRepository.CreateUser,根本不涉及CustomMembershipProvider。我猜UserRepository本身不知道Membership.Provider.Name。我真希望能给你一个简单的答案,但问题不在于语法,而在于概念。不幸的是,我最好的建议是,回到绘图板上,花更多的时间阅读整个会员资格提供商的事情,以及如何定制。不幸的是,这是一个复杂的问题,需要相当多的时间才能理解。真的很抱歉我帮不了你。我使用依赖注入(IOC),这就是为什么
kernel.Bind<IUserRepository>().To<UserRepository>();
public bool RegisterUser(UserModel user)
{
MembershipCreateStatus createStatus;
CreateUser(user.UserName, user.Password, user.Email, user.PasswordQuestion, user.PasswordAnswer, user.IsApproved, null, out createStatus, ...);
public MembershipUser CreateUser(string username, ... , string providername = null)
<membership defaultProvider="YourProvider" userIsOnlineTimeWindow="5">
<providers>
<!--attribute names in camelCase version of .net class MembershipProvider Properties. http://msdn.microsoft.com/en-us/library/system.web.security.membership_properties
See BOS class for constants : BOSSysConst
type = Implmenting provider class namespace.Classname
How to configure membership providers... http://msdn.microsoft.com/en-us/library/6e9y4s5t -->
<add name="YourProvider"
type="YourNamespace.YourProvider"
connectionStringName="YourConnectionString"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="true"
passwordFormat="Hashed"
applicationName="IMPORTANT" />
</providers>
</membership>
// Sample calling the create user function
// POST: /Account/Register
[AllowAnonymous]
[HttpPost]
public ActionResult Register(RegisterModel model)
{
if (ModelState.IsValid)
{
// Attempt to register the user
MembershipCreateStatus createStatus;
Membership.CreateUser(model.UserName, model.Password, model.Email, passwordQuestion: null, passwordAnswer: null, isApproved: true, providerUserKey: null, status: out createStatus);
if (createStatus == MembershipCreateStatus.Success)
{
FormsAuthentication.SetAuthCookie(model.UserName, createPersistentCookie: false);
return RedirectToAction("Index", "Home");
}
else
{
ModelState.AddModelError("", ErrorCodeToString(createStatus));
}
}
// If we got this far, something failed, redisplay form
return View(model);
}