这可能是一个愚蠢的问题,但我在Google上看起来很难,但无法得出答案。
我正在创建一个数据库位于另一个大洲的网站,因此速度是一个至关重要的问题。
据我了解,
WebSecurity.Login(form.userName, form.password))
最初检查它最初设置的数据库,如果用户名和密码正确,则会将您登录。</ p>
现在,对于我写的每个后端功能,我都坚持
[Authorize]
属性和
if (WebSecurity.IsAuthenticated)
{ .... }
在执行任何操作之前。那么WebSecurity.IsAuthenticated是否检查数据库以检查它是否已登录?我只是需要知道速度的原因。
将[Authorize]和WebSecurity.IsAuthenticated放在每个后端方法中也是多余的吗?
感谢您的帮助和意见
答案 0 :(得分:4)
WebSecurity.IsAuthenticated也检查数据库以检查它是否已登录?
不,它只检查当前请求中的主体对象是否将身份验证标志设置为true。
通常主体对象由认证模块设置,几乎没有不同的模块。大多数人使用cookie来保存经过身份验证的用户的信息(例如Forms
,SessionAuthentication
),如果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
仅适用于控制器和操作方法,因此在操作方法上使用它们确实是多余的。