首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FormsAuthenticationTicket没有存储UserData

FormsAuthenticationTicket没有存储UserData
EN

Stack Overflow用户
提问于 2012-09-28 23:00:36
回答 2查看 7.2K关注 0票数 2

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

Login.aspx

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
<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

代码语言:javascript
复制
<configuration>  
  <system.web>
    <authorization>
      <allow roles="Administrator"/>
      <deny users="?"/>
    </authorization>
  </system.web>
</configuration>
EN

回答 2

Stack Overflow用户

发布于 2012-10-03 12:16:58

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

代码语言:javascript
复制
FormsAuthentication.SetAuthCookie();

相反,显式设置cookie

代码语言:javascript
复制
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
cookie.Expires = authTicket.Expiration;
Request.Cookies.Add(cookie);

然后它将在global.asax中可用

代码语言:javascript
复制
var userData = ((FormsIdentity)HttpContext.Current.User.Identity).Ticket.UserData;
票数 2
EN

Stack Overflow用户

发布于 2014-05-05 05:44:29

试着改变

代码语言:javascript
复制
string encryptedTicket = FormsAuthentication.Encrypt(authTicket);
FormsAuthentication.SetAuthCookie(encryptedTicket, true);

代码语言:javascript
复制
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(authTicket));
Response.Cookies.Add(cookie);

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12642516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档