Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 页面加载后调用的MVC身份验证筛选器_C#_Asp.net Mvc_Authentication - Fatal编程技术网

C# 页面加载后调用的MVC身份验证筛选器

C# 页面加载后调用的MVC身份验证筛选器,c#,asp.net-mvc,authentication,C#,Asp.net Mvc,Authentication,我有自己的自定义身份验证过滤器,用于根据我们的单一登录解决方案提供给所有应用程序的cookie值确定用户角色。然后,我们创建特定于应用程序的cookie。我遇到的问题是,在页面加载已经开始之后,似乎正在调用身份验证过滤器 我在控制器操作中添加了以下属性 [Authentication(AuthenticationHelper.ADMIN)] 这是我对ActionFilterAttribute的实现 [AttributeUsage(AttributeTargets.All, AllowMulti

我有自己的自定义身份验证过滤器,用于根据我们的单一登录解决方案提供给所有应用程序的cookie值确定用户角色。然后,我们创建特定于应用程序的cookie。我遇到的问题是,在页面加载已经开始之后,似乎正在调用身份验证过滤器

我在控制器操作中添加了以下属性

[Authentication(AuthenticationHelper.ADMIN)]
这是我对ActionFilterAttribute的实现

[AttributeUsage(AttributeTargets.All, AllowMultiple = false)]
public class AuthenticationAttribute : System.Web.Mvc.ActionFilterAttribute, System.Web.Mvc.IAuthorizationFilter
{
    private readonly string _role;
    private List<string> _roles = new List<string>();

    public AuthenticationAttribute()
    {
    }

    public AuthenticationAttribute(string role)
    {
        _roles.Add(role);
    }
    public void OnAuthorization(AuthorizationContext filterContext)
    {
        if (filterContext == null)
        {
            throw new ArgumentNullException("filterContext is null");
        }

        AuthenticationHelper user = new AuthenticationHelper(filterContext.HttpContext.Request);
        var userRole = user.GetRole();

        if (userRole == null || (userRole != null && !_roles.Contains(userRole))) 
        {
            filterContext.Result = new RedirectResult("/Home/NotAuthorized");
        }
    }
    public string Role
    {
        get { return _role; }
    }
}
[AttributeUsage(AttributeTargets.All,AllowMultiple=false)]
公共类AuthenticationAttribute:System.Web.Mvc.ActionFilterAttribute,System.Web.Mvc.IAuthorizationFilter
{
私有只读字符串_角色;
私有列表_角色=新列表();
公共身份验证属性()
{
}
公共AuthenticationAttribute(字符串角色)
{
_角色。添加(角色);
}
授权时的公共无效(AuthorizationContext filterContext)
{
如果(filterContext==null)
{
抛出新ArgumentNullException(“filterContext为null”);
}
AuthenticationHelper user=新的AuthenticationHelper(filterContext.HttpContext.Request);
var userRole=user.GetRole();
if(userRole==null | | |(userRole!=null&&!\u roles.Contains(userRole)))
{
filterContext.Result=新的重定向结果(“/Home/NotAuthorized”);
}
}
公共字符串角色
{
获取{return\u role;}
}
}

是否在页面加载开始之前执行此操作,或者是否有其他方法在页面加载开始之前创建cookie,以便应用程序可以读取它们?

我不明白。你能描述一下你所说的页面加载是什么意思吗?你希望它什么时候运行?当然,请求处理必须在任何过滤器运行之前开始,但我相信它在控制器方法之前运行,不是吗?为什么从ActionFilter派生?ActionFilters的执行时间比您希望的要晚得多…@fejesjoco问题在于您在最后一句话中指出了什么。它在控制器已经开始处理后执行。@ErikTheViking我还可以从中派生出什么来创建一个仍然允许我将其用作身份验证属性的属性?@atrljoe-您可以从AuthorizeAttribute派生