У меня проблема. Я пишу ASP. NET MVC веб-приложение с логином. В моем приложении мне нужна роль supervisor
, чтобы пользователь мог получить доступ к некоторым частям приложения.
До сих пор я создал пользовательский IPrincipal
, который выглядит следующим образом:
interface ICustomPrincipal : IPrincipal
{
int Id { get; set; }
string UserName { get; set; }
string Email { get; set; }
}
Когда пользователь входит в приложение, я выполняю аутентификацию следующим образом (я получаю данные пользователя от база данных):
CustomPrincipalSerializeModel serializeModel = new CustomPrincipalSerializeModel();
serializeModel.Id = dt.Rows[0].Field<int>("UserID");
serializeModel.Email = dt.Rows[0].Field<string>("Email");
serializeModel.UserName = dt.Rows[0].Field<string>("UserName");
string UserName = dt.Rows[0].Field<string>("UserName");
JavaScriptSerializer serializer = new JavaScriptSerializer();
string userData = serializer.Serialize(serializeModel);
FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1, UserName,
DateTime.Now, DateTime.Now.AddHours(1), false, userData);
string encTicket = FormsAuthentication.Encrypt(authTicket);
HttpCookie faCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket);
Response.Cookies.Add(faCookie);
Пока что это работает просто отлично, и пользователь может без проблем входить и выходить из системы, а повар ie хранит все, что мне нужно.
Теперь я хочу использовать что-то подобное для действий в контроллерах:
[Authorize(Roles = "Supervisor")]
Для этого я создал UserRoleProvider : RoleProvider
, где переопределяю GetRolesForUser
метод.
Вот мой код для этого:
public override string[] GetRolesForUser(string username)
{
String[] role = null;
DataTable dt = new DataTable();
using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["uskladi"].ConnectionString))
{
conn.Open();
if (conn.State == ConnectionState.Open)
{
var upit = "SELECT Supervisor FROM [User] WHERE (UserName = '" + username.TrimEnd() + "'";
using (var cmd = new SqlCommand(upit, conn))
{
cmd.CommandType = CommandType.Text;
SqlDataAdapter sqlda = new SqlDataAdapter(cmd);
sqlda.Fill(dt);
}
}
}
if (dt.Rows[0].Field<bool>("Supervisor"))
{
role = new[] { "Supervisor" };
}
return role;
}
В моей базе данных атрибут супервизора имеет значение true или false в зависимости от того, имеет ли пользователь права супервизора или нет.
Чтобы это работало, я помещаю это в мой web.config
файл:
<roleManager defaultProvider="usersRoleProvider" enabled="true" >
<providers>
<clear/>
<add name="usersRoleProvider" type="Uskladi.Models.UsersRoleProvider"/>
</providers>
</roleManager>
Теперь, когда я вхожу в систему с пользователем, имеющим права администратора, и пытаюсь получить доступ к действию с [Authorize(Roles = "Supervisor")]
, я получаю ошибка, подобная этой:
Эта страница не работает
localhost перенаправляет вас слишком много раз.
- Откуда
GetRolesForUser(string username)
получает имя пользователя? - Кто-нибудь знает, что я делаю неправильно?
Извините, если это плохой вопрос, но это мой первый вопрос, и я относительно новичок в программировании, так как студент.