В ASP.NET MVC, вы можете разметить метод контроллера с AuthorizeAttribute
, например:Почему AuthorizeAttribute перенаправляет на страницу входа для проверки подлинности и авторизации?
[Authorize(Roles = "CanDeleteTags")]
public void Delete(string tagName)
{
// ...
}
Это означает, что, если в данный момент вошедшего в систему пользователя, не в роли «CanDeleteTags», контроллер метод никогда не будет вызван.
К сожалению, для отказов AuthorizeAttribute
возвращает HttpUnauthorizedResult
, который всегда возвращает код состояния HTTP 401. Это вызывает перенаправление на страницу входа.
Если пользователь не вошел в систему, это имеет смысл. Однако, если пользователь уже вошел в систему, но не входит в требуемую роль, это путать, чтобы отправить их обратно на страницу входа.
Кажется, что AuthorizeAttribute
связывает аутентификацию и авторизацию.
Это похоже на недосмотр в ASP.NET MVC, или я чего-то не хватает?
Мне пришлось приготовить DemandRoleAttribute
, который отделяет два. Когда пользователь не аутентифицирован, он возвращает HTTP 401, отправляя их на страницу входа в систему. Когда пользователь вошел в систему, но не входит в требуемую роль, вместо него создается NotAuthorizedResult
. В настоящее время это перенаправляется на страницу с ошибкой.
Неужели мне не нужно было это делать?
Отличный вопрос, и я согласен, должен выдавать статус HTTP Not Authorized. – 2010-06-06 04:13:41
Мне нравится ваше решение, Роджер. Даже если вы этого не сделаете. – 2011-01-07 11:43:52
На моей странице входа есть проверка, чтобы просто перенаправить пользователя в ReturnUrl, если он/она уже автономно. Поэтому мне удалось создать бесконечный цикл из 302 переадресаций: D woot. – 2011-08-24 12:14:10