У меня есть хранимая процедура, которая обновляет статус. В зависимости от роли пользователя хранимая процедура имеет код, который может или не может позволить изменять статус. По этой причине мне нужно передать имя роли в хранимую процедуру. Имя моей роли хранится на клиенте в моем javascript-коде, но, конечно, мне нужна вторая проверка на сервере. Каждый пользователь имеет только одну из трех ролей и при запросе обновления статуса я могу вызвать один из трех методов в зависимости от роли, которую имеет клиент. Вот что я пробовал.
Я использую WebApi с аутентификацией на основе токена и идентификатором ASP.NET 2.1, и приложение всегда работает в браузере. Мои пользователи настроены с соответствующими ролями.
Я установил код, чтобы получить userId, а затем перейдите в таблицу AspNetUserRoles, чтобы получить роль в начале метода. Однако я заметил, что для этого требуется около 500 миллисекунд. В качестве альтернативы я рассматриваю следующее:
[HttpPut]
[Authorize(Roles = "Admin")]
[Route("AdminUpdateStatus/{userTestId:int}/{userTestStatusId:int}")]
public async Task<IHttpActionResult> AdminUpdateStatus(int userTestId, int userTestStatusId)
{
return await UpdateStatusMethod(userTestId, userTestStatusId, "Admin");
}
[HttpPut]
[Authorize(Roles = "Student")]
[Route("StudentUpdateStatus/{userTestId:int}/{userTestStatusId:int}")]
public async Task<IHttpActionResult> StudentUpdateStatus(int userTestId, int userTestStatusId)
{
return await UpdateStatusMethod(userTestId, userTestStatusId, "Student");
}
[HttpPut]
[Authorize(Roles = "Teacher")]
[Route("TeacherUpdateStatus/{userTestId:int}/{userTestStatusId:int}")]
public async Task<IHttpActionResult> TeacherUpdateStatus(int userTestId, int userTestStatusId)
{
return await UpdateStatusMethod(userTestId, userTestStatusId, "Teacher");
}
private async Task<IHttpActionResult> UpdateStatusMethod(int userTestId, int userTestStatusId, string roleName)
{
// Call the stored procedure here and pass in the roleName
}
Это эффективный способ сделать это или есть еще один более чистый способ. То, что я довольно неясно, - это то, что передняя или задняя часть кэширует роль пользователей. Я предполагаю, что это сделано или есть некоторые настройки, которые позволят это сделать.
Примечание. Я использую утверждения для отправки информации о роли моему клиенту здесь:
public static AuthenticationProperties CreateProperties(
string userName,
ClaimsIdentity oAuthIdentity,
string firstName,
string lastName,
int organization)
{
IDictionary<string, string> data = new Dictionary<string, string>
{
{ "userName", userName},
{ "firstName", firstName},
{ "lastName", lastName},
{ "organization", organization.ToString()},
{ "roles",string.Join(":",oAuthIdentity.Claims.Where(c=> c.Type == ClaimTypes.Role).Select(c => c.Value).ToArray())}
};
return new AuthenticationProperties(data);
}
Однако мой вопрос здесь относится к серверу и как я могу проверить свой метод, если пользователь находится в определенной роли, не обращаясь к базе данных. Возможно, есть способ сделать это безопасно с претензиями, но я не знаю, как это сделать.
Любая помощь и советы будут высоко оценены.