Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.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中的自定义身份验证,filterContext为空_C#_Asp.net Mvc - Fatal编程技术网

C# MVC中的自定义身份验证,filterContext为空

C# MVC中的自定义身份验证,filterContext为空,c#,asp.net-mvc,C#,Asp.net Mvc,在一个web应用程序中,我试图引入动作属性以在我的动作中添加身份验证。现在,我在每个操作中单独检查有效会话 我创建了一个自定义属性,该属性使用AuthorizeAttribute: public class BaseAuthAttribute : AuthorizeAttribute 我用这些装饰我的行为 [BaseAuth] 现在在BaseAuthAttribute中,我有以下代码 public override void OnAuthorization(AuthorizationCont

在一个web应用程序中,我试图引入动作属性以在我的动作中添加身份验证。现在,我在每个操作中单独检查有效会话

我创建了一个自定义属性,该属性使用AuthorizeAttribute:

public class BaseAuthAttribute : AuthorizeAttribute
我用这些装饰我的行为

[BaseAuth]
现在在BaseAuthAttribute中,我有以下代码

public override void OnAuthorization(AuthorizationContext filterContext)
{
    var session = new BusinessLayer.PortalUser(filterContext.HttpContext.Request.Cookies["appname"]);
    if(!session.IsAuthorized()
    {
        filterContext.Result = new RedirectToRouteResult(
                new RouteValueDictionary { { "controller", "Home" }, { "action", "Login" } });
    }
}
但是当我没有一个活动会话时,Result=新行会弹出一个对对象实例没有意义的对象

我不是在使用ASP.Net内置的auth,而是在进行自定义以确定是否存在会话/用户。那么,filterContext是否仅在使用AP.Net成员类时使用


如果他们的会话已过期/不存在,或者确实拥有正确的权限,我需要重定向到视图

我为自己设计了一个自定义授权属性,用于检查用户会话,如果过期,则重定向到登录页面。您可以在此对话框中检查会话值

public class SessionExpireAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        // check  sessions here
        if (HttpContext.Current.Session["employeeid"] == null)
        {
            filterContext.Result = new RedirectResult("~/Account/Login");
            return;
        }
        base.OnActionExecuting(filterContext);
    }
}
但您需要将此属性与Authorize属性一起使用,因为它只是检查会话值

已更新

如果您不使用ASP.NET Mebership提供程序,请尝试以下操作

public class BaseAuthAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var session = new BusinessLayer.PortalUser(filterContext.HttpContext.Request.Cookies["appname"]);
        if (!session.IsAuthorized()
        {
            filterContext.Result = new RedirectResult("~/Account/Login");
            return;
        }
        base.OnActionExecuting(filterContext);
    }
}

当您说我需要将此属性与Authorize一起使用时,您的意思是我同时需要这两个属性吗?是的,因为此属性只是检查会话值。您需要使用Authorize属性来授权用户,但是[Authorize]是用于ASP.Net成员身份的-我需要自定义验证,所以我认为我不需要[Authorize]确定。我得到了它。但如果您不使用Asp.Net成员身份,则不能使用从AuthorizeAttribute继承的CustomAuthorize属性。但是,您可以使用我提供的自定义属性并根据您进行更改。@andrewb我已根据您的要求使用自定义授权属性更新了我的答案。