В ASP.NET MVC вы можете пометить метод контроллера с помощью AuthorizeAttribute
, например:
[Authorize(Roles = "CanDeleteTags")]
public void Delete(string tagName)
{
// ...
}
Это означает, что если текущий пользователь не входит в роль "CanDeleteTags", метод контроллера никогда не будет вызываться.
К сожалению, для отказов AuthorizeAttribute
возвращает HttpUnauthorizedResult
, который всегда возвращает код состояния HTTP 401. Это вызывает перенаправление на страницу входа.
Если пользователь не вошел в систему, это имеет смысл. Однако, если пользователь уже вошел в систему, но не входит в требуемую роль, он путается отправить их обратно на страницу входа.
Кажется, что AuthorizeAttribute
объединяет аутентификацию и авторизацию.
Это похоже на недосмотр в ASP.NET MVC, или я чего-то не хватает?
Мне пришлось приготовить DemandRoleAttribute
, который разделяет два. Когда пользователь не аутентифицирован, он возвращает HTTP 401, отправляя их на страницу входа в систему. Когда пользователь входит в систему, но не входит в требуемую роль, вместо него создается NotAuthorizedResult
. В настоящее время это перенаправляется на страницу с ошибкой.
Неужели мне это не нужно было делать?