Как проверить, разрешен ли пользователь внутри Action
Обычно я защищаю свои действия с помощью [Authorize]
, но на этот раз мне нужно проверить, разрешен ли пользователь внутри действия.
Например,
if(userIsAuthorized) {
//do stuff
}
else {
//return to login page
}
Я верю Я использую "Аутентификация форм"
Этот вопрос похож на этот, но ни один из приведенных ответов не работал.
EDIT: я сделал еще больше копания - кажется, что если я оставил точку на Action, у которого есть [Authorize]
, установлен User.Identity, но в действиях без него User.Identity пуст, даже если я вошедший в систему
Ответы
Ответ 1
Если вы просто хотите узнать, вошел ли пользователь в систему:
if (User.Identity.IsAuthenticated) { ... }
Если вы пытаетесь сделать что-то специфическое для ролей:
if (User.IsInRole("Administrators")) { ... }
Экземпляр User
является общедоступным свойством класса Controller
, поэтому у вас всегда есть доступ к нему из контроллера, который вы пишете. Если ни один пользователь не зарегистрировался, вы должны иметь GenericPrincipal
для User
и GenericIdentity
для User.Identity
, поэтому не беспокойтесь о проверке нулей.
Ответ 2
Request.IsAuthenticated
должен работать для того, что вы пытаетесь сделать.
Ответ 3
Я предлагаю сначала выяснить, какое разрешение вы используете.;)
Ответ, который вы опубликовали, верен. Из того, что я помню, выкалывая атрибут [Авторизовать] и связанный с ним код ActionFilter, MVC внутренне вызывает Page.User.Identity.IsAuthenticated так же, как эти примеры кода.
Ответ 4
Создайте такой атрибут: OnActionExecuting будет выполняться сначала перед другим кодом из действия
public class IsAuthenticatedAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
//do your validations here. and redirect to somewhere if needed.
filterContext.HttpContext.Response.Redirect("/") //this will send user to home.
}
}
для каждого действия, где вам нужно проверить, добавьте атрибут следующим образом:
[IsAuthenticatedAttribute]
public ActionResult ActionName(parameters?)
{
// no need to worry about checking here.
//do you action things
}
EDIT:
Это еще завершает действие, а затем перенаправляет его. Не так много полезного.