Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.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# WebSecurity.IsAuthenticated如何检查您是否登录?_C#_Asp.net_.net_Asp.net Mvc_Asp.net Mvc 4 - Fatal编程技术网

C# WebSecurity.IsAuthenticated如何检查您是否登录?

C# WebSecurity.IsAuthenticated如何检查您是否登录?,c#,asp.net,.net,asp.net-mvc,asp.net-mvc-4,C#,Asp.net,.net,Asp.net Mvc,Asp.net Mvc 4,这可能是一个愚蠢的问题,但我在谷歌上仔细研究了一下,没有找到答案 我正在创建一个数据库位于另一个大陆的网站,因此速度是一个关键问题 据我了解, WebSecurity.Login(form.userName, form.password)) 首先检查初始设置的数据库,如果用户名和密码正确,请登录 现在,对于我正在编写的每个后端函数,我都坚持 [Authorize] 属性与a if (WebSecurity.IsAuthenticated) { .... } 在执行任何操作之前。那么Web

这可能是一个愚蠢的问题,但我在谷歌上仔细研究了一下,没有找到答案

我正在创建一个数据库位于另一个大陆的网站,因此速度是一个关键问题

据我了解,

 WebSecurity.Login(form.userName, form.password))
首先检查初始设置的数据库,如果用户名和密码正确,请登录

现在,对于我正在编写的每个后端函数,我都坚持

[Authorize]
属性与a

if (WebSecurity.IsAuthenticated)
{ .... }
在执行任何操作之前。那么WebSecurity.IsAuthenticated是否检查数据库以检查它是否已登录?我只是想知道速度的原因

另外,在每个后端方法中放置[Authorize]和WebSecurity.IsAuthenticated是否也是多余的

谢谢你的帮助和意见

那么WebSecurity.IsAuthenticated是否检查数据库以检查它是否已登录

不,它只是检查当前请求中的主体对象是否将身份验证标志设置为true

通常,主体对象由身份验证模块设置,很少有不同的模块。大多数使用cookie保存已验证用户的信息,例如表单、会话身份验证。如果cookie存在且有效,则模块会为请求设置主体,您可以通过调用:

HttpContext.Current.User
在代码的任何方法中,假设调用是从设置HttpContext.Current的web应用程序进行的

某些身份验证模块可以依赖于其他身份验证因素,例如Windows身份验证依赖于NTLM/Kerberos协议,而NTLM/Kerberos协议又依赖于特定的头,而不是cookie

另外,在每个后端方法中放置[Authorize]和WebSecurity.IsAuthenticated也是多余的

是和否

每个后端方法最可能指的是MVC应用程序中的控制器/操作方法。如果是这样,那么,是的,您不必在控制器/动作方法中重复这两个步骤

但是在后端的任何其他非控制器/操作的方法中,WebSecurity.IsAuthenticated仍然有效,而action属性则无效

因此,如果你所说的每一种方法都是指每一种可能的方法,那么答案是否定的,这两种方法并不是多余的。一个始终有效,另一个仅在MVC控制器中有效

那么WebSecurity.IsAuthenticated是否检查数据库以检查它是否已登录

不,它只是检查当前请求中的主体对象是否将身份验证标志设置为true

通常,主体对象由身份验证模块设置,很少有不同的模块。大多数使用cookie保存已验证用户的信息,例如表单、会话身份验证。如果cookie存在且有效,则模块会为请求设置主体,您可以通过调用:

HttpContext.Current.User
在代码的任何方法中,假设调用是从设置HttpContext.Current的web应用程序进行的

某些身份验证模块可以依赖于其他身份验证因素,例如Windows身份验证依赖于NTLM/Kerberos协议,而NTLM/Kerberos协议又依赖于特定的头,而不是cookie

另外,在每个后端方法中放置[Authorize]和WebSecurity.IsAuthenticated也是多余的

是和否

每个后端方法最可能指的是MVC应用程序中的控制器/操作方法。如果是这样,那么,是的,您不必在控制器/动作方法中重复这两个步骤

但是在后端的任何其他非控制器/操作的方法中,WebSecurity.IsAuthenticated仍然有效,而action属性则无效


因此,如果你所说的每一种方法都是指每一种可能的方法,那么答案是否定的,这两种方法并不是多余的。一个始终有效,另一个-仅在MVC控制器中。

除了@Wiktor Zychla所说的之外,值得注意的是WebSecurity.IsAuthenticated在功能上与Request.IsAuthenticated相同;准确地说,它是一个包装器:

namespace WebMatrix.WebData
{
    //other class content omitted for brevity
    public static class WebSecurity
    {

        //Context
        internal static HttpContextBase Context
        {
            get { return new HttpContextWrapper(HttpContext.Current); }
        }

        //Request
        internal static HttpRequestBase Request
        {
            get { return Context.Request; }
        }

        //WebSecurity.IsAuthenticated 
        public static bool IsAuthenticated
        {
            get {  return Request.IsAuthenticated; }
        }

    }
}
因此,如果将以上所有内容放在一起,WebSecurity.IsAuthenticated等于HttpContextWrapperHttpContext.Current.Request.IsAuthenticated

旁白:正如其他答案和评论中正确指出的那样,[授权]用于指定对控制器的访问和操作方法:

指定对控制器或操作方法的访问仅限于满足授权要求的用户


因此,IsAuthenticated对动作方法和非动作方法都有效,而[Authority]只对控制器和动作方法有效,这使得在动作方法上同时使用这两种方法确实是多余的。

除了@Wiktor Zychla所说的,需要注意的是,WebSecurity.IsAuthenticated在功能上与Request.IsAuthenticated相同;准确地说,它是一个包装器:

namespace WebMatrix.WebData
{
    //other class content omitted for brevity
    public static class WebSecurity
    {

        //Context
        internal static HttpContextBase Context
        {
            get { return new HttpContextWrapper(HttpContext.Current); }
        }

        //Request
        internal static HttpRequestBase Request
        {
            get { return Context.Request; }
        }

        //WebSecurity.IsAuthenticated 
        public static bool IsAuthenticated
        {
            get {  return Request.IsAuthenticated; }
        }

    }
}
所以如果你把上面所有的t 同时,WebSecurity.IsAuthenticated等于HttpContextWrapperHttpContext.Current.Request.IsAuthenticated

旁白:正如其他答案和评论中正确指出的那样,[授权]用于指定对控制器的访问和操作方法:

指定对控制器或操作方法的访问仅限于满足授权要求的用户


因此,IsAuthenticated对操作方法和非操作方法都有效,而[Authority]只对控制器和操作方法有效,这使得在操作方法上同时使用这两种方法确实是多余的。

我相信它只检查客户端是否有身份验证cookie集。是的,我相信,至少在较旧的实现(如.NET2中的成员资格功能)中,它是这样工作的。我还认为,使用[Authorize]属性修饰方法和使用WebSecurity检查方法都是多余的。IsAuthenticated。[Authorize]是一个操作筛选器,应用于非操作的方法时无效。JsonResult是mvc控制器操作的返回类型,这是Ban mvc controller上可路由方法的名称,如果这是后端函数的意思,则仅应用“授权”属性就足够了。@HaukurHaf:不一定是cookie,这取决于实际使用的自动验证方案。在Windows身份验证的情况下,没有身份验证cookie,有ntlm/kerberos头。我相信它只检查客户端是否有身份验证cookie集。是的,至少在较旧的实现中,如.NET 2中的成员资格功能,它是这样工作的。我还认为,使用[Authorize]属性修饰方法和使用WebSecurity检查方法都是多余的。IsAuthenticated。[Authorize]是一个操作筛选器,应用于非操作的方法时无效。JsonResult是mvc控制器操作的返回类型,这是Ban mvc controller上可路由方法的名称,如果这是后端函数的意思,则仅应用“授权”属性就足够了。@HaukurHaf:不一定是cookie,这取决于实际使用的自动验证方案。在Windows身份验证的情况下,没有身份验证Cookie,存在ntlm/kerberos头。