我一直在网上阅读大量有关身份验证和授权的内容,最后确定了一些似乎正在运行的代码......但我并不完全了解它所做的一切(就FormsAuthenticationTicket而言)。
我正在使用的MVC应用程序将处理一些敏感数据,我想要检查与验证和授权相关的所有操作。
我正在使用Windows身份验证;
<authentication mode="Windows" />
<authorization>
<deny users="?"/>
</authorization>
我在SQL Server中有一组表,其中包含其他用户和权限信息。
在我的Global.asax中,我有以下方法受到启发
http://www.codeproject.com/Articles/5182/Insight-into-Security-Model-using-Principal-and-Id
protected void WindowsAuthentication_OnAuthenticate(object sender, WindowsAuthenticationEventArgs e)
{
if (e.Identity == null || !e.Identity.IsAuthenticated)
{
//Redirect to error or access denied page
}
string userData = e.Identity.AuthenticationType;
var cachedUser = HttpContext.Current.Cache[e.Identity.Name] as User;
if (cachedUser == null)
{
var user = repo.GetUserByFullUserName(e.Identity.Name);
HttpContext.Current.Cache.Insert(e.Identity.Name, user, null, DateTime.Now.AddMinutes(2), Cache.NoSlidingExpiration);
cachedUser = HttpContext.Current.Cache[e.Identity.Name] as User;
}
var userIdentity = e.Identity.Name;
var formsAuthTicket = new FormsAuthenticationTicket(1, e.Identity.Name, DateTime.Now, DateTime.Now.AddMinutes(2), false, userData);
var encryptedTicket = FormsAuthentication.Encrypt(formsAuthTicket);
var httpcook = new HttpCookie("authCookie", encryptedTicket);
Response.Cookies.Add(httpcook);
}
protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
if (Request.IsAuthenticated)
{
var httpcook = Context.Request.Cookies["authCookie"];
var formsAuthTicket = FormsAuthentication.Decrypt(httpcook.Value);
var cachedUser = GetCachedUser(formsAuthTicket.Name);
if (cachedUser == null)
{
cachedUser = CreateCachedUser(formsAuthTicket.Name);
}
var genIdentity = new GenericCustomIdentity(cachedUser, Request.IsAuthenticated, formsAuthTicket.UserData);
var genPrincipal = new GenericCustomPrincipal(genIdentity, cachedUser);
HttpContext.Current.User = genPrincipal;
}
}
所以这是我的问题:
为什么WindowsAuthentication_OnAuthenticate方法中有FormsAuthenticationTicket?我不能只在WinAuth方法中构建我的Identity和Principal对象吗?
在HttpContext.Current.Cache中存储用户数据存在安全隐患吗?由于这些方法被多次调用,我不希望每次请求都能访问db。是否有更好/更安全的替代方案?
我不熟悉使用FormsAuthenticationTickets,Identity和Principal,因此我们将非常感谢您提出任何意见或建议。对不起,这不是问题。
答案 0 :(得分:3)
为什么WindowsAuthentication_OnAuthenticate方法中有FormsAuthenticationTicket?我不能在WinAuth方法中构建我的Identity和Principal对象吗?
Identity和Principal对象仅在来自客户端的当前调用/请求期间存在。它们是HttpContext的一部分,并且由于缺少更好的术语,在请求结束时处置。一旦经过身份验证的人再次连接,就会创建一个新请求,默认情况下他们不会进行身份验证。
FormsAuthenticationTicket(默认情况下)使用客户端上的cookie来存储每个后续请求的身份验证信息。这允许Application_AuthenticateRequest
方法使用cookie重新授权请求。
在HttpContext.Current.Cache中存储用户数据是否存在安全风险?由于这些方法被多次调用,我不想在每个请求中点击数据库。是否有更好/更安全的替代方案?
HttpContext.Cache存储在内存中。如果服务器重置或应用程序池因任何原因重新启动,则缓存消失。
是的,存在安全风险,您存储的用户信息是服务器内存。然而风险非常小,除非有人让你的代码看你如何使用缓存,并且可以上传代码来读取缓存。
我不熟悉使用FormsAuthenticationTickets,Identity和Principal,因此我们将非常感谢您提出任何意见或建议。对不起,这不是一个问题。
HttpContext.User (IPrincipal)与IIdentity属性的链接如何{{3}}类型的标识。不是最具描述性的答案,但两个界面都非常基本。