Session 如果使用表单身份验证,请将会话[key]检查为null

Session 如果使用表单身份验证,请将会话[key]检查为null,session,asp.net-mvc-4,Session,Asp.net Mvc 4,我有一个MVC4应用程序。我使用表单身份验证的位置。 在该应用程序中,我使用会话变量。 我需要检查它们是否为空值,还是它会自动检查会话。 若为空,则重定向到登录页面 如果我正在使用下面这样的功能,它会自动重定向到我的登录操作 string lstrUserId=Context.Session["UserId"]; 或者我需要手动检查吗 if(Context.Session["UserId"] != null) RedirectToAction("Login", "Home");

我有一个MVC4应用程序。我使用表单身份验证的位置。
在该应用程序中,我使用会话变量。
我需要检查它们是否为空值,还是它会自动检查会话。
若为空,则重定向到登录页面

如果我正在使用下面这样的功能,它会自动重定向到我的登录操作

string lstrUserId=Context.Session["UserId"];
或者我需要手动检查吗

 if(Context.Session["UserId"] != null)
       RedirectToAction("Login", "Home");
就我的知识会话而言,它是由框架本身维护的


如果是这样,我为什么会得到空引用异常。

[Authorize]
属性添加到控制器。

如果您使用的是FormsAuthentication之类的东西,如果用户的计算机上有有效的FormsAuthentication cookie(您可以使用FormsAuthentication.SetAuthCookie添加),这将设置为true

Authorize属性通过查看HttpContext.User.Identity.IsAuthenticated来工作

下面的代码来自已发布的Microsoft Authorization Attrubute的源代码

 protected virtual bool AuthorizeCore(HttpContextBase httpContext) {
    if (httpContext == null) {
        throw new ArgumentNullException("httpContext");
    } 

    IPrincipal user = httpContext.User; 
    if (!user.Identity.IsAuthenticated) { 
        return false;
    } 

    if (_usersSplit.Length > 0 && !_usersSplit.Contains(user.Identity.Name,StringComparer.OrdinalIgnoreCase)) {
        return false;
    } 

    if (_rolesSplit.Length > 0 && !_rolesSplit.Any(user.IsInRole)) { 
        return false; 
    }

    return true;
}

我使用创建了一个类
CustomAuthorizeAttribute:AuthorizeAttribute
并使用了它。@Shekhar这没关系,但是如果您对这个自定义类进行了任何重写,它可能会工作不好。只需确保您仍然在重写的
virtual
方法中调用
base
继承的方法。