У меня есть задача создать пользователя с доступом только для чтения для нашего приложения ASP.Net MVC3. Т.е. они могут войти в систему, просмотреть все данные, но не могут обновить данные.
Я прочитал много статей / фреймворков аутентификации, например эту: Реализуйте безопасные приложения ASP.NET MVC или Fluent Security Configuration или Создание фильтров действий в ASP.Net MVC (и некоторых других, ссылки на которые я уже потерял).
Проблема с большинством подходов в том, что они требуют кардинальных изменений домена / приложения. И у меня есть только один день, чтобы реализовать эту функцию.
У нас есть около сотни контроллеров, в среднем по 4 действия на контроллер (в основном операции CRUD), и о прохождении каждого из них не может быть и речи. Также было бы легко забыть добавить атрибуты в новый код - это приведет к ошибкам.
До сих пор я придумал глобальный фильтр, который запрещает все действия на основе POST и действия контроллера под названием «Создать» для пользователя с доступом только для чтения:
public class ReadOnlyFilter : IActionFilter
{
public void OnActionExecuting(ActionExecutingContext filterContext)
{
var currentUser = HttpContext.Current.User;
if (currentUser == null || !currentUser.Identity.IsAuthenticated)
return; // user is not logged in yet
if (!currentUser.IsInRole("Readonly"))
return; // user is not read-only. Nothing to see here, move on!
// Presume User is read-only from now on.
// if action is of type post - deny
if (filterContext.HttpContext.Request.HttpMethod.ToUpper() == "POST")
{
filterContext.HttpContext.Response.Redirect("~/ReadOnlyAccess");
}
// if action is "Create" - deny access
if (filterContext.ActionDescriptor.ActionName == "Create")
{
filterContext.HttpContext.Response.Redirect("~/ReadOnlyAccess");
}
// if action is edit - check if Details action exits -> redirect to it.
//TODO get this done ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
return;
}
public void OnActionExecuted(ActionExecutedContext filterContext)
{
// blah! have to have this here for IActionFilter
}
}
Следующим шагом я планирую создать атрибут [AllowReadOnlyUser] для действий публикации, таких как изменение пароля / адреса электронной почты, и в фильтре разрешить выполнение этого действия.
Интересно, есть ли способы сделать это лучше?
Обновление: приложение не предназначено для публичного использования. Он используется в корпоративном мире для отслеживания людей, активов и других скучных данных.
Обновление 2: похоже, я закончил с этой задачей. Сделал это как контроллер, как и начал. Полный код и некоторые пояснения, которые вы можете увидеть в моем блоге.