2013-07-07 3 views
4

У меня есть следующие требования для реализации списка контроля доступаНастройки Авторизоваться Фильтр атрибут параметра

public class SecurityObject{ 
public string Key{get;set;} 
public string DisplayName{get;set;} 
public bool isAllowed{get;set;} 
} 

public class Role{ 
List<SecurityObject> AccessibleObjects{get;set;} 
} 

В настоящее время я использую проверку подлинность форм для базовой авторизации. Ниже мой код

Global.asax.cs

public class MvcApplication : System.Web.HttpApplication 
{ 
    public override void Init() 
    { 
     this.PostAuthenticateRequest += new 
          EventHandler(MvcApplication_PostAuthenticateRequest); 

     base.Init(); 
    } 
    void MvcApplication_PostAuthenticateRequest(object sender, EventArgs e) 
    { 
     HttpCookie authCookie = 
     HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName]; 
     if (authCookie != null) 
     { 
      string encTicket = authCookie.Value; 
      if (!String.IsNullOrEmpty(encTicket)) 
      { 
       FormsAuthenticationTicket ticket = 
           FormsAuthentication.Decrypt(encTicket); 

       string[] userData = ticket.UserData.Split(new string[] { "___" }, 
           StringSplitOptions.None); 
       string[] roles = null; 
       if (userData.Length > 1) 
       { 
        roles = userData[1].Split(','); 
       } 
      MyCustomIdentity identity = new MyCustomIdentity(ticket); 
      GenericPrincipal principle = new GenericPrincipal(identity, roles); 
      HttpContext.Current.User = principle; 
      } 
     } 
    }} 

Мой текущий класс контроллера

public class AdminController : Controller 
{ 
    [HttpPost, Authorize, ValidateAntiForgeryToken] 
    public ActionResult SaveUser(UserDetailViewModel viewModel) 
    { 

    } 
    } 

Мой класс контроллера Target

public class AdminController : Controller 
{ 
    [HttpPost, Authorize(ACLKey="USR_SAVE"), ValidateAntiForgeryToken] 
    public ActionResult SaveUser(UserDetailViewModel viewModel) 
    { 

    } 
    } 

Я хочу, чтобы мой метод действия должны быть оформлены с ACLKey, и я хотел бы проверить, имеет ли роль пользователя данный ключ и на основании этого я ed для выполнения или возврата страницы HttpUnauthorizedResult, даже для запросов Ajax из jQuery.

Я упоминал много как Customizing authorization in ASP.NET MVC Но я не нашел способ выполнить проверку подлинности обеих форм и мою обычную проверку ACLKey.

Как разобрать значение USR_SAVE и обработать пользовательскую аутентификацию с помощью CustomAuthorizeFilter?

ответ

1

Вы можете использовать атрибут фильтра:

public class ACLCheckAttribute : FilterAttribute, IActionFilter 

В OnActionExecuting, вы можете захватить USR_SAVE. Не зная, откуда приходит, я предположил бы, что она исходит от:

  • формы: вы можете захватить любые значения формы из контекста, перешедший в ONActionExecuting, перейдя к коллекции HttpContext.Request.Form
  • Сессия и т. Д .: HttpContext также имел бы эти.
  • Способ действия: Из атрибута, используя контекст, переданный в течение действия, он имеет список ActionParameters, которые могут быть доступны как словарь, что позволяет проверять и извлекать свою ценность

Если где-то else, прокомментируйте, где. Вы можете применить этот атрибут к контроллеру или методу или глобально установить его, добавив его в коллекцию globalfilters (GlobalFilters.Filters.Add()) или в файле FilterConfig в папке App_Start.

+0

Как насчет использования 'IAuthorizationFilter' здесь? Я только что опубликовал свой ответ по этому вопросу –

+0

Вы правы, я должен был использовать этот интерфейс. Слишком рано утром здесь :-) –

+0

Ницца. Ваш ответ был полезен, и это заставляет меня отвечать :) –

5

Вы можете попробовать, как этот

public class FeatureAuthenticationAttribute : FilterAttribute, IAuthorizationFilter 
{ 
    public string AllowFeature { get; set; } 

    public void OnAuthorization(AuthorizationContext filterContext) 
    { 

     var filterAttribute = filterContext.ActionDescriptor.GetFilterAttributes(true) 
           .Where(a => a.GetType() == 
           typeof(FeatureAuthenticationAttribute)); 
     if (filterAttribute != null) 
     { 
      foreach (FeatureAuthenticationAttribute attr in filterAttribute) 
      { 
       AllowFeature = attr.AllowFeature; 
      } 
     List<Role> roles = 
     ((User)filterContext.HttpContext.Session["CurrentUser"]).Roles; 
     bool allowed = SecurityHelper.IsAccessible(AllowFeature, roles); 
     if (!allowed) 
      { 
       filterContext.Result = new HttpUnauthorizedResult(); 
      } 
     } 
    } 
} 

В вас метод действия

[FeatureAuthentication(AllowFeature="USR_SAVE")] 
    public ActionResult Index() 
    { 
    } 

Надеюсь, что это поможет вам!

Смежные вопросы