所有页面上都提供MVC 5用户数据

时间:2017-07-23 13:46:59

标签: asp.net asp.net-mvc asp.net-mvc-5

基本上我需要在网站的所有页面上提供用户数据。 我需要在布局中显示一些用户属性,例如:

  

[用户名],[FirstName],[LastName],[电子邮件],[IsEmailVerified],   [电话],[LastLoginDate]和另外4个属性...

但是,需要考虑这些方面:

  1. 不使用Session(我在我的应用程序中禁用了它)。
  2. 为了获取这些用户属性,每个请求都没有数据库交互 - 我想让它们获取一次属性并将它们存储在可用的位置。
  3. 我使用表单身份验证。
  4. 现在,通过我的一些搜索,我发现自2008年发布的这篇文章,由Microsoft发布,关于表单身份验证:Storing Additional User Data in the TicketUsing a Custom Principal

    我认为这是最接近的方法,因为现在我使用 User.Identity.Name 来仅获取存储在身份验证票据中的[用户名],我喜欢使用它,因为它很快,可用且简单。

    但是我也有一些问题困扰我这个方法:

    1. 这张贴于2008年,是否仍与2017年相关?今天有什么更好的新东西吗?
    2. 正如您在上面所看到的,我有相当多的用户属性需要进入auth cookie,而且正如我所读 - auth cookie中的很多用户数据都没有被推荐......
    3. 感谢帮助者。

1 个答案:

答案 0 :(得分:1)

是的,它仍然有效。尽管人们会告诉您存在涉及声明的新方法,并且您应该考虑新的身份子系统,但旧的良好表单身份验证仍然是可行的选择之一。

对于“大量数据”,它只是表单模块的一个缺点,它不处理多个cookie,因此,您受到单个cookie的4kb限制的约束。考虑到加密和签名,这使得cookie的自定义数据部分中可用的数据少得多。但是,仍然应该有一个类似10个属性的简单序列化。

如果您想向前迈出一半,您可以切换到会话身份验证模块,这样做的好处是它基于声明并且它支持大型用户数据(因为它会自动将数据拆分为块) 。我前段时间写过这篇博客

http://www.wiktorzychla.com/2014/11/forms-authentication-revisited-for-net.html

此方法的摘录

var identity = new ClaimsIdentity( "custom" );
identity.AddClaim( new Claim( ClaimTypes.Name, txtLogin.Text ) );

var principal = new ClaimsPrincipal( identity );

principal.AddClaim( new Claim( ClaimTypes.UserData, "whatever goes here" ) );

SessionAuthenticationModule sam =    
      FederatedAuthentication.SessionAuthenticationModule;
var token = 
sam.CreateSessionSecurityToken( principal, string.Empty, 
     DateTime.Now.ToUniversalTime(), DateTime.Now.AddMinutes(20).ToUniversalTime(), false );

sam.WriteSessionTokenToCookie( token );