2012-01-19 2 views
1

я реализовали пользовательские членство .Здесь мой заказ MembershipProvidet и мой заказ RoleProvideПочему метод IsInRole не работает пользовательский RoleProvider asp.net mvc?

public class FinkaynMembershipProvider : MembershipProvider 
{ 

    BLL.GestionUserAccount gestionUserAccount = new BLL.GestionUserAccount(); 
    #region Unimplemented MembershipProvider Methods 
    public override string ApplicationName 
    { 
     get 
     { 
      return "FinKayn"; 
     } 
     set 
     { 
      throw new NotImplementedException(); 
     } 

    } 
    public override bool ChangePassword(string username, string oldPassword, string newPassword) 
    { 
     throw new NotImplementedException(); 
    } 
    public override bool ChangePasswordQuestionAndAnswer(string username, string password, string newPasswordQuestion, string newPasswordAnswer) 
    { 
     throw new NotImplementedException(); 
    } 
    public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status) 
    { 
     throw new NotImplementedException(); 
    } 

    public override bool DeleteUser(string username, bool deleteAllRelatedData) 
    { 
     throw new NotImplementedException(); 
    } 
    public override bool EnablePasswordReset 
    { 
     get { throw new NotImplementedException(); } 
    } 
    public override bool EnablePasswordRetrieval 
    { 
     get { throw new NotImplementedException(); } 
    } 
    public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, out int totalRecords) 
    { 
     throw new NotImplementedException(); 
    } 
    public override MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out int totalRecords) 
    { 
     throw new NotImplementedException(); 
    } 
    public override MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords) 
    { 
     throw new NotImplementedException(); 
    } 
    public override int GetNumberOfUsersOnline() 
    { 
     throw new NotImplementedException(); 
    } 
    public override string GetPassword(string username, string answer) 
    { 
     throw new NotImplementedException(); 
    } 




    public override MembershipUser GetUser(object providerUserKey, bool userIsOnline) 
    { 
      throw new NotImplementedException(); 
    } 

    public static long FinKaynUserId 
    { 
     //long FinKaynUserId = 0; 
     get 
     { 
      if (HttpContext.Current.Session["FinKaynUserId"] != null && Convert.ToInt64(HttpContext.Current.Session["FinKaynUserId"]) != 0) 
       return Convert.ToInt64(HttpContext.Current.Session["FinKaynUserId"]); 
      else 
      { 
       HttpCookie myCookie = HttpContext.Current.Request.Cookies["FinKaynUserId"]; 
       if (myCookie != null) 
       { 
        HttpContext.Current.Session["FinKaynUserId"] = Convert.ToInt64(myCookie.Value); 
        // Session["User"] = (new UserManager()).GetUser(Convert.ToInt64(Session["UserId"])); 
        return Convert.ToInt64(HttpContext.Current.Session["FinKaynUserId"]); 
       } 
       else 
        return 0; 
      } 
     } 
     set 
     { 
      HttpCookie cookie = new HttpCookie("FinKaynUserId"); 
      cookie.Value = value.ToString(); 
      cookie.Secure = false; 
      cookie.Expires = DateTime.Now.AddDays(3); 
      HttpContext.Current.Request.Cookies.Add(cookie); 
      HttpContext.Current.Session["FinKaynUserId"] = value; 
     } 

    } 

    public MembershipUser GetUser(string userId) 
    { 
     throw new NotImplementedException(); 
    } 
    public override MembershipUser GetUser(string username, bool userIsOnline) 
    { 
     //MembershipUser userRep = new MembershipUser(); 
      entities.UserAccount user = gestionUserAccount.getUserAccount(username); 
      if (user != null) 
      { 
       MembershipUser memUser = new MembershipUser("FinkaynMembershipProvider", username, user.IdUser, user.Email, 
                  string.Empty, string.Empty, 
                  true, false, DateTime.MinValue, 
                  DateTime.MinValue, 
                  DateTime.MinValue, 
                  DateTime.Now, DateTime.Now); 
       return memUser; 
      } 
      return null; 
    } 
    public override string GetUserNameByEmail(string email) 
    { 
     throw new NotImplementedException(); 
    } 
    public override int MaxInvalidPasswordAttempts 
    { 
     get { throw new NotImplementedException(); } 
    } 
    public override int MinRequiredNonAlphanumericCharacters 
    { 
     get { throw new NotImplementedException(); } 
    } 
    public override int MinRequiredPasswordLength 
    { 
     get { return 6; } 
    } 
    public override int PasswordAttemptWindow 
    { 
     get { throw new NotImplementedException(); } 
    } 
    public override MembershipPasswordFormat PasswordFormat 
    { 
     get { throw new NotImplementedException(); } 
    } 
    public override string PasswordStrengthRegularExpression 
    { 
     get { throw new NotImplementedException(); } 
    } 
    public override bool RequiresQuestionAndAnswer 
    { 
     get { throw new NotImplementedException(); } 
    } 
    public override bool RequiresUniqueEmail 
    { 
     get { return true; } 
    } 
    public override string ResetPassword(string username, string answer) 
    { 
     throw new NotImplementedException(); 
    } 
    public override bool UnlockUser(string userName) 
    { 
     throw new NotImplementedException(); 
    } 
    public override void UpdateUser(MembershipUser user) 
    { 
     throw new NotImplementedException(); 
    } 

    #endregion 





    public override bool ValidateUser(string email, string password) 
    { 
     if (string.IsNullOrEmpty(password.Trim()) || string.IsNullOrEmpty(email.Trim())) return false; 
     // password=(new CryptoEngine()).Encrypt(password); 
     entities.UserAccount user = gestionUserAccount.authentifier(email, password); 



     if (user == null) 
     { 
      // User = new UserAccount(); 
      return false; 
     } 
     if (user.IdUser>0) 
     { 
      // User = user; 
      return true; 
     } 
     return false; 
    } 




} 

public class FinKaynRoleProvider : RoleProvider 
{ 

    GestionRole gestionRole = new GestionRole(); 
    GestionUserAccount gestionUserAccount = new GestionUserAccount(); 

    public FinKaynRoleProvider() 
    { 

    } 

    public override string ApplicationName 
    { 
     get 
     { 
      return "finkayn"; 
     } 
     set 
     { 
      throw new NotImplementedException(); 
     } 
    } 

    public override void Initialize(string name, NameValueCollection config) 
    { 
     base.Initialize(name, config); 

     //IUnityContainer container = new UnityContainerFactory().Create(); 
     // accountRepository = container.Resolve<IAccountRepository>(); 
    } 
    public override void AddUsersToRoles(string[] usernames, string[] roleNames) 
    { 
     throw new NotImplementedException(); 
    } 
    public override void RemoveUsersFromRoles(string[] usernames, string[] roleNames) 
    { 
     throw new NotImplementedException(); 
    } 
    public override void CreateRole(string roleName) 
    { 
     throw new NotImplementedException(); 
    } 
    public override bool DeleteRole(string roleName, bool throwOnPopulatedRole) 
    { 
     throw new NotImplementedException(); 
    } 

    /// <summary> 
    /// roles of a user ,acutually it's userName =email in our case 
    /// </summary> 
    /// <param name="email"></param> 
    /// <returns></returns> 
    public override string[] GetRolesForUser(string email) 
    { 

     return gestionUserAccount.GetRolesForUser(email); 

    } 

    public override bool IsUserInRole(string email, string roleName) 
    { 
     string[] userRoles = this.GetRolesForUser(email); 

     return userRoles.Contains(roleName); 
    } 
    public override string[] GetUsersInRole(string roleName) 
    { 
     throw new NotImplementedException(); 
    } 
    public override bool RoleExists(string roleName) 
    { 
     return (new GestionRole()).RoleExists(roleName); 
    } 
    public override string[] FindUsersInRole(string roleName, string usernameToMatch) 
    { 
     throw new NotImplementedException(); 
    } 
    public override string[] GetAllRoles() 
    { 
     return (new GestionRole()).GetAllRoles(); 
    } 

}

По мнению ведущего страницы: У меня есть ссылка, которая должна была замечена торчат на роль (роли сохраняются в таблице роли, пользователь может иметь множество ролей)

  <a> 
     <%if (HttpContext.Current.User.IsInRole("admin")){%> 
      <%=Html.ActionLink("Places", "Places", "Places")%> 
     <%} %> 
     </a> 

в соответствии с этим вопрос: custom RoleProvider

GetRolesForUser должен выполняться при вызове IsInRole. Я наложил на него точку останова, но ничего не происходит. В чем проблема?

Я добавил RoleProvider в web.config тоже:

 <authentication mode="Forms"> 
    <forms loginUrl="../Auth/signin" timeout="2880" path="/" /> 
</authentication> 
<membership defaultProvider="FinkaynMembershipProvider"> 
    <providers> 
    <clear/> 
    <add name="FinkaynMembershipProvider" type="FinkaynMembershipProvider" 
     connectionStringName="FinKaynConnectionString" 
     enablePasswordRetrieval="false" 
     enablePasswordReset="true" 
     requiresQuestionAndAnswer="false" 
     requiresUniqueEmail="false" 
     maxInvalidPasswordAttempts="5" 
     minRequiredPasswordLength="6" 
     minRequiredNonalphanumericCharacters="0" 
     passwordAttemptWindow="10" 
     applicationName="/" /> 
    </providers> 

</membership> 
<roleManager defaultProvider="FinKaynRoleProvider" enabled="true" cacheRolesInCookie="true" > 
    <providers> 
    <clear/> 
    <add name="FinKaynRoleProvider" type="FinKaynRoleProvider"/> 
    </providers> 
</roleManager> 
+0

Вызывается ли что-нибудь еще? У вас есть поставщик, настроенный в вашем web.config? –

+0

да, его софигурировано в web.config –

+0

Возможно, проблема в вашем членском провайдере; он может переопределять код проверки по умолчанию. Вы должны опубликовать это также. – Jacob

ответ

0

Вы пробовали полностью квалифицируя поставщику роль в вашем web.config. Атрибут type должен содержать пространство имен типов.

Также измените имя параметра метода GetRolesForUser обратно на имя пользователя

+0

Я положил его в app_data без пространства имен. –

+0

@ user594166, 'App_Data'? Вы имели в виду 'App_Code'? И если вы имеете в виду «App_Code», почему вы используете его в приложении ASP.NET MVC. И если вы имеете в виду «App_Data», знайте, что эту папку не следует использовать для размещения файлов исходного кода. –

+0

Кто сказал, что.Я видел, как работает членство, я использовал его в представлении и с его работами: <%if (Context.User.Identity.IsAuthenticated){%> <%= Html.ActionLink("sign out", "Signout", "Home")%> <%} %> <%else{%> <%= Html.ActionLink("Sign in", "signin", "Auth")%> <%}%>

Смежные вопросы