Итак, пользователь регистрируется в моем приложении (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).