asp.net-mvc-4 - ASP.NET mvc 4为什么使用FormsAuthenticationTicket进行 Windows 身份验证?

  显示原文与译文双语对照的内容

关于身份验证和授权,我在线阅读了很多东西,最终确定了一些似乎正在工作的代码,但我不完全理解它正在做的事情。

我正在处理的MVC应用程序将处理一些敏感数据,并且我想要检查一些与身份验证和授权相关的。

我正在使用 Windows 认证;


<authentication mode="Windows"/>


<authorization> 


 <deny users="?"/>


</authorization>



我在 SQL Server 中有一组表,其中包含额外的用户和权限信息。

  • 用户
  • 角色
  • UsersInRoles
  • 其他定义应用程序中的对象和关联权限的表。

在我的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方法中生成我的标识和主体对象?

将用户数据存储在 HttpContext.Current.Cache 中的安全风险? 因为这些方法被多次调用,所以我不想在每次请求时都碰到数据库。 是否有更好的或者更安全的替代方案?

我不熟悉使用 FormsAuthenticationTickets,身份和主体,所以任何评论或者建议都会大大感谢。 抱歉,这不是一个问题。

时间: 原作者:

WindowsAuthentication_OnAuthenticate方法中为什么有 FormsAuthenticationTicket? 我不能在WinAuth方法中生成我的标识和主体对象?

仅在客户端当前调用/请求期间存在标识和主体对象。 它们是的一部分,对于缺少更好的术语,在请求的末尾 disposed disposed disposed 。 一旦被认证的人再次连接,就会创建一个新的请求,默认情况下它们不是 authenitcated 。

在客户机端使用cookie来存储每个后续请求的验证信息。 这允许 Application_AuthenticateRequest 方法使用cookie重新批准请求。

将用户数据存储在 HttpContext.Current.Cache 中的安全风险? 因为这些方法被多次调用,所以我不想在每次请求时都碰到数据库。 是否有更好的或者更安全的替代方案?

HttpContext.Cache 存储在内存中。 如果服务器重置或者应用程序池重新启动,缓存将消失。

是,这是一个安全风险,你正在存储用户信息的服务器内存。 不过,风险非常小,除非有人让你的代码了解如何使用缓存,并且可以上传代码来读取缓存。

我不熟悉使用 FormsAuthenticationTickets,身份和主体,所以任何评论或者建议都会大大感谢。 抱歉,这不是一个问题。

links HttpContext.User ( IPrincipal )的链接,它是 IIdentity的属性标识。 不是最具描述性的答案,但这两个接口。

原作者:
...