【问题标题】:FormsAuthenticationTicket isn't storing UserDataFormsAuthenticationTicket 不存储 UserData
【发布时间】:2014-05-05 05:44:28
【问题描述】:

我对 .NET 比较陌生,正在尝试弄清楚 FormsAuthentication。我经历了几个不同的教程,每次遇到同样的问题。由于某种原因,UserData 没有存储在票证中。当我在 Global.aspx.cs 中的票证上设置中断时,UserName 在那里,但 UserData 是一个空字符串,当它被指定为 1 时,版本设置为 2。另一个奇怪的事情是每个经过身份验证的用户都被允许当 web.config 指定只有管理员可以访问我的 Admin_Content 文件夹中的页面。

登录.aspx

UserFull user = ManageUsers.login(loginTemplate.UserName, loginTemplate.Password);
if (user != null)
{
    string[] roles = { user.role };

    FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
        1,
        userName,
        DateTime.Now,
        DateTime.Now.AddDays(30),
        true,
        roles[0],
        FormsAuthentication.FormsCookiePath
    );

    string encryptedTicket = FormsAuthentication.Encrypt(authTicket);
    FormsAuthentication.SetAuthCookie(encryptedTicket, true);

    Response.Redirect("Admin_Content/Admin.aspx");
 }

Global.aspx.cs Application_AuthenticateRequest

if (HttpContext.Current.User != null)
{
    if (HttpContext.Current.User.Identity.IsAuthenticated)
    {
        if (HttpContext.Current.User.Identity is FormsIdentity)
        {
            FormsIdentity id = (FormsIdentity)HttpContext.Current.User.Identity;
            FormsAuthenticationTicket ticket = (id.Ticket);
            if (!string.IsNullOrEmpty(ticket.UserData))
            {
                string userData = ticket.UserData;
                string[] roles = userData.Split(',');
                HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(id, roles);
            }
        }
    }
}

主 web.config

<configuration>
<system.web>
  <compilation debug="true" targetFramework="4.0" />
  <roleManager enabled="true"></roleManager>
  <authentication mode="Forms">
    <forms name="AOTMP_Demo" loginUrl="Login.aspx"
    protection="All" path="/" cookieless="UseCookies"/>
  </authentication>
  <authorization>
    <allow users="*"/>
  </authorization>
</system.web>
<configuration>

Admin_Content 文件夹的 web.config

<configuration>  
  <system.web>
    <authorization>
      <allow roles="Administrator"/>
      <deny users="?"/>
    </authorization>
  </system.web>
</configuration>

【问题讨论】:

    标签: asp.net forms-authentication


    【解决方案1】:

    你不应该这样做...因为它会创建一个新的授权票。

    FormsAuthentication.SetAuthCookie();
    

    改为显式设置 cookie

    var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
    cookie.Expires = authTicket.Expiration;
    Request.Cookies.Add(cookie);
    

    然后它将在 global.asax 中可用

    var userData = ((FormsIdentity)HttpContext.Current.User.Identity).Ticket.UserData;
    

    【讨论】:

    • FormsAuthentication.SetAuthCookie 完全符合它的预期并且适合这种情况:msdn.microsoft.com/en-us/library/twk5762b(v=vs.100).aspx。我已经测试过你放在一起的小技巧,但它对我来说根本不起作用,而且技巧也很少可靠。
    • @cjbarth,如何使用 FormsAuthentication.SetAuthCookie 设置 UserData?
    • @cjbarth:它的不是 hack。当开箱即用的选项不够用时,这就是如何设置 cookie。
    【解决方案2】:

    尝试改变

    string encryptedTicket = FormsAuthentication.Encrypt(authTicket);
    FormsAuthentication.SetAuthCookie(encryptedTicket, true);
    

    HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(authTicket));
    Response.Cookies.Add(cookie);
    

    我相信FormsAuthentication.SetAuthCookie 已经在内部调用了FormsAuthentication.Encrypt,所以你可能会收到一个格式错误的cookie。

    【讨论】:

      猜你喜欢
      • 2014-03-08
      • 2013-01-29
      • 2013-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多