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

时间:2015-09-18 17:10:17

标签: c# asp.net .net asp.net-mvc asp.net-mvc-4

这可能是一个愚蠢的问题,但我在Google上看起来很难,但无法得出答案。

我正在创建一个数据库位于另一个大洲的网站,因此速度是一个至关重要的问题。

据我了解,

 WebSecurity.Login(form.userName, form.password))

最初检查它最初设置的数据库,如果用户名和密码正确,则会将您登录。<​​/ p>

现在,对于我写的每个后端功能,我都坚持

[Authorize]

属性和

if (WebSecurity.IsAuthenticated)
{ .... }

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

将[Authorize]和WebSecurity.IsAuthenticated放在每个后端方法中也是多余的吗?

感谢您的帮助和意见

2 个答案:

答案 0 :(得分:4)

  

WebSecurity.IsAuthenticated也检查数据库以检查它是否已登录?

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

通常主体对象由认证模块设置,几乎没有不同的模块。大多数人使用cookie来保存经过身份验证的用户的信息(例如FormsSessionAuthentication),如果cookie存在且有效,则模块会设置请求的主体,您可以通过调用来获取:

HttpContext.Current.User

在代码的任何方法中(假设调用是从设置HttpContext.Current的Web应用程序进行的)。

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

  

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

是和否。

“每个后端方法”最可能意味着你的意思是MVC应用程序中的控制器/动作方法。如果是这样,,则不必在控制器/操作方法中重复这两种情况。

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

因此,如果通过“每种方法”你的字面意思是每种可能的方法,那么答案是,这两种方法并不是多余的。一个总是工作,另一个 - 只在MVC控制器中。

答案 1 :(得分:1)

除了@Wiktor Zychla所说的内容之外,注意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

因此,如果将上述所有内容放在一起,HttpContextWrapper(HttpContext.Current).Request.IsAuthenticated等同于[Authorize]

除此之外:正如其他答案和评论中所述,IsAuthenticated用于指定对控制器和操作方法的访问:

  

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

因此[Authorize]适用于操作方法和非操作方法,而TextFieldParser仅适用于控制器和操作方法,因此在操作方法上使用它们确实是多余的。