2013-04-21 2 views
0

В моем C приложения # MVC4, я совершаю несколько различных переадресацией действий изнутри пользовательского AUTHORIZE атрибута зависит, если пользователь вошел в систему, в определенной роли и т.д.Пользовательские Авторизоваться Атрибут Перенаправление Когда Несанкционированное

Я поместил атрибут authorize выше одного из моих результатов. Если пользователь не вошел в систему или не прошел проверку подлинности или вошел в систему, но не был членом какой-либо группы, с которой я проверяю, я хочу, чтобы код в результате действия был выполнен. Если пользователь вошел в систему и является членом любой из групп, я хочу перенаправить на другое действие (это в настоящее время работает).

С моим текущим кодом те, которые вошли в систему и в пределах указанной группы, перенаправляются по желанию. Все, перечисленные в других категориях, заставляют мой AuthorizationContext иметь значение null. Зная, что когда вызывается null HandleUnauthorizedRequest, я попытался переопределить его, чтобы разрешить доступ к исходному результату actionresult, но не могу понять это.

Независимо от того, что я пытаюсь я получаю ошибку: Object Reference not set to an instance of an object на линии с: filterContext.Result = new RedirectToRouteResult(

Мой код атрибута авторизированным ниже:

 public class AuthorizeEditAttribute : AuthorizeAttribute 
     { 
      public string hName { get; set; } 
     public override void OnAuthorization(AuthorizationContext filterContext) 
     { 
      base.OnAuthorization(filterContext); 

      // Check if user is authenticated and if this action requires authorization 
      if (filterContext.HttpContext.User.Identity.IsAuthenticated 
       && filterContext.ActionDescriptor.IsDefined(typeof(AuthorizeAttribute), true) 
       || filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AuthorizeAttribute), true)) 
      { 
       List<object> attributes = new List<object>(filterContext.ActionDescriptor.GetCustomAttributes(typeof(AuthorizeAttribute), true)); 
       attributes.AddRange(filterContext.ActionDescriptor.ControllerDescriptor.GetCustomAttributes(typeof(AuthorizeAttribute), true)); 


       hName = filterContext.Controller.ValueProvider.GetValue("hSearch").AttemptedValue; 


       // Check all authorzation attributes 
       foreach (var attribute in attributes) 
       { 

        var authAttribute = attribute as AuthorizeAttribute; 
        if (authAttribute != null) 
        { 
         if ((filterContext.HttpContext.User.IsInRole("TCL-CAdmin")) || (filterContext.HttpContext.User.IsInRole("TCL-C Group"))) 
         { 

          // User is not authorized to perform edits so redirect to Index_Perm ActionResult 
          filterContext.Result = new RedirectToRouteResult(
           new RouteValueDictionary 
          { 
           //{ "area", "" }, 
           { "controller", "Home" }, 
           { "action", "Index_Perm" }, 
           { "hSearch", hName.ToString() } 
          }); 
          break; 
         } 
         else 
         { 
          filterContext.Result = new RedirectToRouteResult(
           new RouteValueDictionary 
          { 
           //{ "area", "" }, 
           { "controller", "Home" }, 
           { "action", "Index" }, 
           { "hSearch", hName.ToString() } 
          }); 
          break; 
         } 
        } 
       } 
      } 
      else 
      { 

       filterContext.Result = new RedirectToRouteResult(
    new RouteValueDictionary 
          { 
           { "controller", "Home" }, 
           { "action", "Index" }, 
           { "hSearch", hName.ToString() } 
          }); 
      } 
     } 

     protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
     { 

       filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary 
          { 
           { "controller", "Home" }, 
           { "action", "Index" }, 
           { "hSearch", hName.ToString() } 
          }); 
     } 
    } 
} 

Вместо того, перекрывая HandleUnauthorizedRequest, я также попытался модифицируя начальная часть OnAuthorization выглядит так:

public override void OnAuthorization(AuthorizationContext filterContext) 
     { 

      base.OnAuthorization(filterContext); 

      if (filterContext.Result is HttpUnauthorizedResult) 
      { 
       filterContext.Result = new RedirectToRouteResult(
    new RouteValueDictionary 
          { 
           { "controller", "Home" }, 
           { "action", "Index" }, 
           { "hSearch", hName.ToString() } 
          }); 
      } 

и я все еще получаю такое же предупреждение abou t ссылка на объект.

ответ

0

Проблема была вызвана значением маршрута «hSearch», которому присваивалось значение hName. В каждой из моих попыток имя hName всегда было нулевым, потому что я не задавал его значение до строки: hName = filterContext.Controller.ValueProvider.GetValue("hSearch").AttemptedValue;, которая никогда не ударялась.

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