0

从此解决方案继续:How to configure Ninject for MVC4 & custom Membership provide?

我声明

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);
}

并在UserRepository中实现

public class UserRepository : RepositoryBase<MyDbContext, UserModel>, IUserRepository
{
        UserModel _user = null;

        public UserRepository(IUnitOfWork<MyDbContext> unitOfWork)
            : base(unitOfWork)
{

}

   public MembershipUser CreateUser(string username, ... , string providername = null)
        {                
            using (UnitOfWork)
            {                   
                _user = new UserModel
                {
                    Id = Guid.NewGuid(),
                    RoleId = roleId
                    [other property set]
                };    
                Insert(_user);
                UnitOfWork.Commit();
             }
                status = MembershipCreateStatus.Success;

                return new MembershipUser(providername, ...);
}

public bool RegisterUser(UserModel user)
{
        MembershipCreateStatus createStatus;
        CreateUser(user.UserName, user.Password, user.Email, user.PasswordQuestion, user.PasswordAnswer, user.IsApproved, null, out createStatus, ...);

   if (createStatus == MembershipCreateStatus.Success)
   {
                    return true;
   }
   else
   {                return false;
   }
}
[..]

现在在 CustomMembership Provider 中

public class CustomMembershipProvider : MembershipProvider
    {

        public IUserRepository UserRepository { get { return DependencyResolver.Current.GetService<IUserRepository>(); } }

    public override MembershipUser CreateUser(string username, ...)
        {
            return UserRepository.CreateUser(username, password, email, passwordQuestion, passwordAnswer, isApproved, providerUserKey, out status, Membership.Provider.Name);
        }
[...]

现在在控制器中

public AccountController(IAccountRepository accountRepository, IUserRepository userRepository, IUnitOfWork<MyDbContext> unitOfWork)
{
            _acountRepository = accountRepository;
            _userRepository = userRepository;
            UnitOfWork = unitOfWork;
}

public ActionResult Register(UserModel model)
{
    if (ModelState.IsValid)
    {
      _userRepository.RegisterUser(model);
    }
}

笔记:

1.我从这一行 的 UserRepository CreateUser 方法中得到 Error Provider name is Nullreturn new MembershipUser(providername,...);

但我已经Membership.Provider.NamecustomMembership提供程序中传递了它。

2.Controller调用Membershipprovider方法的正确方法是什么?

3.是否需要通过IUserRepository调用 Membership 提供程序方法的任何其他Ninject配置,除此之外?

 kernel.Bind<IUserRepository>().To<UserRepository>();

4. Web.config 如上一篇文章

4

2 回答 2

0

在 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>

Controller 调用静态类 createUser Membership.CreateUserMembership.ValidateUser 进行登录。

有关实施自定义提供程序的详细信息,请参阅 http://msdn.microsoft.com/en-us/library/44w5aswa%28v=vs.100%29.aspx

    // 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);
    }
于 2013-01-21T11:35:48.850 回答
0

因此,您有 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 ,您可以将其注入到您的控制器中。

我不能给你一个简单的“改变这条线”的答案,这个问题是概念性的,对不起。你可以传递一个硬编码的提供者名称,但你确实开始违反一切。

于 2013-01-20T14:32:56.457 回答