ASP. NET MVC - авторизация пользователя с ролью и пользовательским IPrincipal - PullRequest
0 голосов
/ 12 апреля 2020

У меня проблема. Я пишу 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 перенаправляет вас слишком много раз.

  1. Откуда GetRolesForUser(string username) получает имя пользователя?
  2. Кто-нибудь знает, что я делаю неправильно?

Извините, если это плохой вопрос, но это мой первый вопрос, и я относительно новичок в программировании, так как студент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...