0

好的,我被分配了在登录页面上使用的身份验证。我已经为此工作了很长时间,并决定清理它。我面临的问题是没有抛出异常,没有生成错误,一切看起来都很好,但是当你尝试使用一个函数时,它会返回一个你不想要的结果。

我使用的代码看起来与此页面中的代码非常相似:

http://msdn.microsoft.com/en-us/library/system.web.security.formsauthenticationticket.aspx

我在我的项目中使用了演示中的代码:

  FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1,
    username,
    DateTime.Now,
    DateTime.Now.AddMinutes(30),
    isPersistent,
    userData,
    FormsAuthentication.FormsCookiePath);

  // Encrypt the ticket.
  string encTicket = FormsAuthentication.Encrypt(ticket);

  HttpCookie myCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket)

  // Create the cookie.
  Response.Cookies.Add(myCookie);

因此,如果我登录,一切正常,下面的代码评估为真:HttpContext.Current.User.Identity.IsAuthenticated;

但是,如果我想使用任一版本将子键包含到 myCookie 中:

  myCookie.Values.Add("userName", "patrick"); //version 1
  myCookie.Values["userName"] = "patrick";  //version 2

然后添加到 cookie 集合中:

  Response.Cookies.Add(myCookie);

然后登录后刷新页面:

  //This always set to false even after successful log on
  HttpContext.Current.User.Identity.IsAuthenticated;

不知道为什么!

我想做一些我不必立即将加密值添加到 httpcookie 的事情:

 //IsAuthenticated doesn't work = false
 HttpCookie cookie = new HttpCookie(FormsAuthentication.FormCookieName);
 cookie.Values.Add("encryptTicket", encTicket);

添加子键根本不起作用,这很奇怪。而且我被迫加密一张票以使其正常工作。我的意思是,无论是否登录和验证,IsAuthenticated 始终为假。任何人都可以尝试解释这是怎么回事吗?我有一个可行的解决方案,但任何见解都会有所帮助。

4

1 回答 1

0

好吧,我想我想通了。这是因为我的 web.config 是如何设置表单身份验证的。使用表单标签。

FormsAuthenticationTicket会查看该标签以获取特定信息,如果我没有从中创建 cookie,它就不会对我进行身份验证。这也被默认为 UseCookies 的无 cookie 模式。

但无论如何,在我创建了一个 cookie 之后,我就通过了身份验证,然后为我创建了一个新会话。之后,我可以提供任何我想要的额外 cookie,并让网站根据需要使用它们。但只要 AuthCookie(在我的情况下为 .ASPXAUTH)是有效的,我的身份验证会话也是如此。

事实上,当我试图在浏览器关闭时结束 cookie 会话时,通过将 cookie 和票证的到期日期设置为 MinValue,我也无法进行身份验证!我必须使票证的持续时间比实际的 cookie 长,这样票证才不会在 cookie 到期之前过期。

票证信息实际上是用于制作 cookie 的配置,在创建 cookie 之后,浏览器定义了 cookie 的使用方式。

于 2013-06-12T05:41:49.450 回答