Как ограничить доступ к определенным страницам в ASP.NET MVC? - PullRequest
5 голосов
/ 03 июня 2009

Я хочу заблокировать доступ к странице EDIT пользователя (например, /user/pure.krome/edit), если

a) Identity.IsAuthenticated = false

или они аутентифицированы, но

b) Idenitity.Name! = Имя пользователя пользовательской страницы, которую они пытаются редактировать
c) Identity.UserType ()! = UserType.Administrator // Это похоже на роль без использования RoleProviders.

Я предполагаю, что вы можете украсить контроллер или метод действия контроллера чем-то, но я просто не уверен, что?

Ответы [ 3 ]

3 голосов
/ 03 июня 2009

Пользовательский атрибут, полученный из AuthorizeAttribute - это то, что я использую для этого. Переопределите метод OnAuthorize и реализуйте собственную логику.

public class OnlyUserAuthorizedAttribute : AuthorizeAttribute
{
    public override void OnAuthorize( AuthorizationContext filterContext )
    {
        if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            filterContext.Result = new HttpUnauthorizeResult();
        }
        ...
    }
}
3 голосов
/ 03 июня 2009
2 голосов
/ 04 июня 2009

Я реализовал следующий ActionFilterAttribute, и он работает как для аутентификации, так и для ролей. Я храню роли в моих собственных таблицах БД следующим образом:

  • Пользователь
  • UserRole (содержит внешние ключи UserID и RoleID)
  • Роль
public class CheckRoleAttribute : ActionFilterAttribute
{
    public string[] AllowedRoles { get; set; }


    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        string userName = filterContext.HttpContext.User.Identity.Name;

        if (filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            if (AllowedRoles.Count() > 0)
            {
                IUserRepository userRepository = new UserRepository();
                User user = userRepository.GetUser(userName);
                bool userAuthorized = false;
                foreach (Role userRole in user.Roles)
                {
                    userAuthorized = false;
                    foreach (string allowedRole in AllowedRoles)
                    {
                        if (userRole.Name == allowedRole)
                        {
                            userAuthorized = true;
                            break;
                        }
                    }
                }
                if (userAuthorized == false)
                {
                    filterContext.HttpContext.Response.Redirect("/Account/AccessViolation", true);
                }
            }
            else
            {
                filterContext.HttpContext.Response.Redirect("/Account/AccessViolation", true);
            }
        }
        else
        {
            filterContext.HttpContext.Response.Redirect(FormsAuthentication.LoginUrl + String.Format("?ReturnUrl={0}", filterContext.HttpContext.Request.Url.AbsolutePath), true);
        }


    }

Я называю это так ...

    [CheckRole(AllowedRoles = new string[] { "admin" })]
    public ActionResult Delete(int id)
    {
        //delete logic here
    }
...