gpt4 book ai didi

c# - Cookie 与 FormsAuthentication.SetAuthCookie() 方法混淆

转载 作者:IT王子 更新时间:2023-10-29 03:59:03 24 4
gpt4 key购买 nike

因此 StackOverflow 上有很多关于此的帖子,但我仍然无法解决我的确切问题。这是要点:

我有一个需要身份验证的网站。我正在使用标准的 .NET FormsAuthentication.SetAuthCookie() 方法来保持用户的 session 。

我的问题是:在 web.config 文件中,“/system.web/authentication/forms”节点有一个超时属性。如果我将此值设置为 30 分钟,这是用户在 session 到期之前可以拥有的用户不活动时间吗?

我问的原因是,无论我将此值设置为什么,如果我在 SetAuthCookie() 中将持久性设置为 true,则 cookie 集的到期时间为 90 分钟。如果我在 SetAuthCookie() 中将持久性设置为 false,则 cookie 过期设置为“ session 结束”。

“超时”属性值的实际设置是什么,我如何才能获得持续一个月、一年或更长时间的持久性 cookie?

最佳答案

您在 /system.web/authentication/forms 中找到的参数超时是身份验证票持续时间的超时(以分钟为单位)。

这意味着在一段时间不活动后,系统会提示用户再次登录。如果您尝试检查此 My.Profile.Current.IsAuthenticated,它将是 false

您可以选择不保留 cookie。在这种情况下,如果您的票过期,您的 cookie 也会过期。 Cookie(以防万一)的目的是在用户返回您的网站时记住他/她。

您可能希望将 cookie 保留 10 年,这样用户就不必再次输入用户名和密码,除非他们选择删除 cookie。即使浏览器关闭(持久化时),cookie 仍然有效。

另一个需要记住的重要事项是参数 slidingExpiration:

<authentication mode="Forms">
<forms loginUrl="~/Partner/LogOn" defaultUrl="~/Home/Index"
timeout="30" slidingExpiration="true" />
</authentication>

如果这是真的,您的身份验证票将在每次您的网站上有事件时更新:刷新页面等。

你能做的——我已经做过的——就是像这样写你自己的 cookie:

 FormsAuthenticationTicket authTicket = new
FormsAuthenticationTicket(1, //version
userName, // user name
DateTime.Now, //creation
DateTime.Now.AddMinutes(30), //Expiration (you can set it to 1 month
true, //Persistent
userData); // additional informations

更新

我已经实现了这个例程,因为我想将我的组存储在加密的 cookie 中:

Dim authTicket As System.Web.Security.FormsAuthenticationTicket = _
New System.Web.Security.FormsAuthenticationTicket( _
1, _
UserName, _
Now, _
Now.AddYears(100), _
createPersistentCookie, _
UserData)

Dim encryptedTicket As String = System.Web.Security.FormsAuthentication.Encrypt(authTicket)

Dim authCookie As HttpCookie = New HttpCookie( _
System.Web.Security.FormsAuthentication.FormsCookieName, _
encryptedTicket)

If (createPersistentCookie) Then
authCookie.Expires = authTicket.Expiration
End If

Response.Cookies.Add(authCookie)

如您所见,我已将身份验证 cookie 和身份验证票证的到期时间设置为相同的超时(仅在持久存在时)。

我尝试过的另一件事是将用户名和密码存储在加密的 cookie 中。每次加载母版页时,我都会检查 My.Profile.Current.IsAuthenticated 以查看身份验证是否仍然有效。如果不是,我再次读取 cookie,获取用户名和密码,并在数据库中检查:

Public Function ReadCookieAuthentication(ByVal Context As System.Web.HttpContext) As Security.CookieAuth

Dim CookieUserData = New Security.CookieAuth()

Dim cookieName As String = System.Web.Security.FormsAuthentication.FormsCookieName
Dim authCookie As HttpCookie = Context.Request.Cookies(cookieName)

If (Not (authCookie Is Nothing)) Then
Dim authTicket As System.Web.Security.FormsAuthenticationTicket = Nothing
Try
authTicket = System.Web.Security.FormsAuthentication.Decrypt(authCookie.Value)
If (Not (authTicket Is Nothing)) Then
If (authTicket.UserData IsNot Nothing) AndAlso Not String.IsNullOrEmpty(authTicket.UserData) Then
CookieUserData = New JavaScriptSerializer().Deserialize(Of Security.CookieAuth)(authTicket.UserData.ToString)
End If
CookieUserData.UserName = authTicket.Name
End If
Catch ex As Exception
' Do nothing.
End Try
End If

Return (CookieUserData)

End Function

Security.CookieAuth 是我创建的用于返回用户名和密码的对象。
CookieUserData 是存储我的密码和组的地方(我保存为 json 格式)。

关于c# - Cookie 与 FormsAuthentication.SetAuthCookie() 方法混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4939533/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com