Обновление роли пользователя не работает! - PullRequest
0 голосов
/ 14 июня 2011

Итак, пользователь регистрируется в моем приложении (ASP .NET MVC 3).Если регистрация прошла успешно, назначьте ему роль с именем «unreg» (то есть его общество еще не зарегистрировано).Завершение регистрации перенаправит его на указанное действие (RegisterSociety).Если он успешно регистрирует свое общество, тогда я даю ему роль «пользователя».В любом случае, User.IsInRole ("user") возвращает FALSE, даже если моя база данных изменилась правильно (я использую пользовательскую аутентификацию и авторизацию).

Где и в чем заключается проблема и как я могу ее решить?

ОБНОВЛЕНИЕ:

У меня есть две таблицы, используемые для аутентификации / авторизации: - пользователь и роли.Roles.id_role - это внешний ключ в пользовательской таблице (user.id_role).

- Мой поставщик аутентификации ...

    public class Authentication: MembershipProvider
    {
    public InMVC3.Models.useri CreateUser(string username, string password, string nume, string SCI, string NCI, string CNP, string email, int id_tip_user, out MembershipCreateStatus status)
    {
        useri us = new useri();

        us.username = username;
        us.parola = password;
        us.nume = nume;
        us.serie_ci = SCI;
        us.nr_ci = NCI;
        us.CNP = CNP;
        us.email = email;
        us.id_tip_user = id_tip_user;

        ValidatePasswordEventArgs args = new ValidatePasswordEventArgs(username, password, true);
        OnValidatingPassword(args);

        if (args.Cancel)
        {
            status = MembershipCreateStatus.InvalidPassword;
            return null;
        }

        useri u = _user.GetUserByUsername(username);

        if (u == null)
        {
            _user.Add(us);
            status = MembershipCreateStatus.Success;
            return _user.GetUserByUsername(username);
        }

        else
        {
            status = MembershipCreateStatus.DuplicateUserName;
        }
        return null;
    }
} 

- Мой поставщик роли

   public class Autorizatie : RoleProvider
{
    IUserRepository _user;
    IRolRepository _rol;

    public Autorizatie() : this(null) { }

    public Autorizatie(IUserRepository provider)
    {
        _user = new UserRepository();
        _rol = new RolRepository();
    }

    public override string[] GetRolesForUser(string username)
    {
        useri user = _user.GetUserByUsername(username);
        tip_useri rol = _rol.GetRolById(user.id_tip_user);

        string[] roles = new string[1];
        roles[0] = rol.rol;

        return roles;
    }

    public override bool IsUserInRole(string username, string roleName)
    {
        useri user = _user.GetUserByUsername(username);
        tip_useri rol = _rol.GetRolByRoleName(roleName);

        if (user != null && rol != null)
        {
            if (user.tip_useri.id_tip_user == rol.id_tip_user)
                return true;
            else return false;
        }
        return false;
    }


    public override void AddUsersToRoles(string[] usernames, string[] roleNames)
    {
        useri user = _user.GetUserByUsername(usernames[0]);
        tip_useri rol = _rol.GetRolByRoleName(roleNames[0]);
        if (user != null && rol != null)
        {
            user.id_tip_user = rol.id_tip_user;
            _user.Update();
        }
    }
}

- Регистрация пользователя

[HttpPost]
public ActionResult Register(RegisterModel model)
{
        Autentificare provider = (Autentificare)Membership.Provider;
        IUserRepository _user = new UserRepository();
        IRolRepository rol = new RolRepository();
        IClientiRepository _client = new ClientiRepository();

        var us = rol.GetRolByRoleName("unreg").id_tip_user;
        if (ModelState.IsValid)
        {
            // Attempt to register the user
            MembershipCreateStatus createStatus;
            provider.CreateUser(model.UserName, model.Password, model.Nume, model.SCI, model.NCI, model.CNP, model.Email, us, out createStatus);


            if (createStatus == MembershipCreateStatus.Success)
            {
                FormsService.SignIn(model.UserName, false /* createPersistentCookie */);
                return RedirectToAction("RegisterFirma", "Account");
            }
            else
            {
                ModelState.AddModelError("", AccountValidation.ErrorCodeToString(createStatus));
            }
        }

        return View(model);
    }

- Регистрация общества

[HttpPost]
 public ActionResult RegisterFirma(RegisterFirma client)
 {
        Autentificare provider = (Autentificare)Membership.Provider;
        IUserRepository _user = new UserRepository();
        IClientiRepository _client = new ClientiRepository();
        RoleService = new Autorizatie();

        clienti cl = new clienti();

        if (ModelState.IsValid)
        {
            // Attempt to register the user
            try
            {
                cl.denumire = client.Firma;
                cl.cod_fiscal = client.CodFiscal;
                cl.reg_comert = client.Registrul;
                cl.id_grupa = 1;
                cl.id_localitate = Convert.ToInt32(client.Loc);
                cl.adresa = client.Address;
                cl.email = client.Email;
                cl.telefon = client.Telefon;
                cl.fax = client.Fax;
                cl.pers_contact = client.PersContact;
                cl.id_banca = Convert.ToInt32(client.Banca);
                cl.cont_bancar = client.ContBancar;
                cl.id_user = _user.GetUserByUsername(User.Identity.Name).id_user;

                string[] usn = new string[1];
                usn[0] = User.Identity.Name;
                string[] rls = new string[1];
                rls[0] = "user";

                RoleService.AddUsersToRoles(usn, rls);
               // _user.GetUserByUsername(User.Identity.Name).id_tip_user = 3;
               // _user.Update();

                _client.Add(cl);
                FormsService.SignOut();
                FormsService.SignIn(usn[0], false); -- even after sign out and sign in
                return RedirectToAction("Index", "Home");
            }
            catch
            {
                //  return View(client);
                return RedirectToAction("LogOn", "Account");
            }

        }

Внутри базы данных user.id_role изменяется в соответствии с ролью «пользователя».Через несколько минут после изменения, когда я снова запускаю свое приложение, кажется, что роли работают в соответствии с базой данных.

ОБНОВЛЕНИЕ 2

 <roleManager defaultProvider="Autorizatie"  enabled="true" cacheRolesInCookie="false" >
  <providers>
    <clear/>
    <add name="Autorizatie"  type="InMVC3.Models.Autorizatie"/>
   </providers>
  </roleManager>

Я использовал «true», а затем изменил на «false» и все тот же (для chacheRolesInCoockie).

1 Ответ

1 голос
/ 14 июня 2011

Я думаю, причина в том, что GetRolesForUser возвращает только 1 роль для пользователя.Следовательно, User.IsInRole не найдет вторую роль в массиве строк.

ОБНОВЛЕНИЕ: Вы правы, вам всегда назначена только 1 роль, извините.

Еще один совет: чтоследующий звонок сделать?RoleService.AddUsersToRoles(usn, rls); Вызывает ли он вашего провайдера напрямую?

AFAI видит, что роли кэшируются инфраструктурой провайдера ролей, даже если вы не используете куки-файлы, но кэш установлен статическим методом System.Web.Security.Roles.AddUsersToRole().Можете ли вы проверить, если вы вызываете этот метод?Может быть, вы напрямую позвонили своему провайдеру ролей, который затем не устанавливает кеш грязным.

...