В моем 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 ссылка на объект.