包含HttpCookie子键或不加密时,IsAuthenticated始终为false

时间:2013-05-31 04:26:51

标签: c# authentication .net-2.0 httpcookie formsauthenticationticket

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

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

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);

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

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

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

然后你添加到cookies集合:

  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始终是假的,登录和验证与否。任何人都可以尝试解释这是怎么回事?我有一个有效的解决方案,但任何见解都会有所帮助。

1 个答案:

答案 0 :(得分:0)

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

FormsAuthenticationTicket查看该标记以获取特定信息,如果我没有创建cookie,则不会对我进行身份验证。这也违反了无Cookie模式到UseCookies。

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

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

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