Rendre la connexion de l'utilisateur persistante avec l'adhésion à ASP .Net
J'ai un site qui est construite en ASP.NET 3.5 & SQL Server 2005, à l'aide de sql fournisseur d'appartenances, et sans doute l'authentification par formulaires.
Depuis des besoins de sécurité sur mon site sont très faibles, je tiens à authentifier une seule fois, puis conserver le journal en a persisté pendant une période indéterminée (sans donner à l'utilisateur le choix).
Ce qui se passe est que l'utilisateur se connecte, reste connecté pendant la session, et puis la prochaine fois qu'ils arrivent, ils sont déconnectés.
Comment puis-je obtenir le journal en persisté?
Voici les détails techniques, j'ai expérimenté avec de nombreuses variations de durées.
Try
If Membership.ValidateUser(UserName.Text, Password.Text) Then
Security.UserManager.AuthenticateUser(UserName.Text)
If FormsAuthentication.GetRedirectUrl(UserName.Text, False) = "/default.aspx" Then
Try
'Custom Logic'
Catch Ex As Exception
'Custom Error handling'
End Try
Else
FormsAuthentication.RedirectFromLoginPage(UserName.Text, True)
End If
End If
Catch ex As Exception
RaiseEvent ExceptionThrown(New ApplicationException("An error occurred trying to log the user in after account creation.", ex))
End Try
Public Shared Sub AuthenticateUser(ByVal Username As String)
Dim Expiration As DateTime = DateTime.Now.AddMonths(3)
Dim authTicket As FormsAuthenticationTicket = New FormsAuthenticationTicket(Username, True, Expiration.Subtract(Expiration).TotalMinutes)
Dim EncryptedTicket As String = FormsAuthentication.Encrypt(authTicket)
Dim AuthCookie As New HttpCookie(FormsAuthentication.FormsCookieName, EncryptedTicket)
AuthCookie.Expires = Expiration
HttpContext.Current.Response.Cookies.Add(AuthCookie)
End Sub
Web Config:
<membership defaultProvider="SqlProvider" userIsOnlineTimeWindow="15">
<providers>
<clear />
<add
name="SqlProvider"
type="System.Web.Security.SqlMembershipProvider"
connectionStringName="GlobalConnString"
applicationName="/"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="false"
requiresUniqueEmail="true"
passwordFormat="Hashed"
minRequiredPasswordLength="5"
minRequiredNonalphanumericCharacters="0"
/>
</providers>
</membership>
<authentication mode="Forms">
<forms timeout="1439200" name="SITENAME" loginUrl="/login.aspx" />
</authentication>
Edit: Voici les informations du cookie qui est stocké par le client:
Name ASP.NET_SessionId
Value r4dz1555f1pdne45n1zrlkmg
Host SITEADDRESS.com
Path /
Secure No
Expires At End Of Session
Name .ASPXAUTH
Value 648767AC72A60DBA49650A361A2FA446BA992F792055EF5B488CADC95DF495315C1C577F1C8E67E67BD937A7AB6CC5DAED85D8D64E4ED7867FC0FC395F48FED7FB631033CE441DE85223E8B3EBAE616C
Host www.SITEADDRESS.com
Path /
Secure No
Expires Tue, 09 Jun 2009 17:51:31 GMT
Name ASP.NET_SessionId
Value gn5pcymhfsnua455yp45wpej
Host www.SITEADDRESS.com
Path /
Secure No
Expires At End Of Session
Name SITENAME
Value 9610E8515F3DBC088DAC286E1F44311A20CB2BBB57C97F906F49BC878A6C6AC0B9011777402AEA130DCDC521EF4FBB3393DB310083F72EB502AE971183306C24F07F696B3695C67DD73166F1653DF52B
Host www.SITEADDRESS.com
Path /
Secure No
Expires Tue, 20 Dec 2011 06:14:10 GMT
source d'informationauteur Tom Halladay
Vous devez vous connecter pour publier un commentaire.
J'ai enfin trouvé la dernière pièce du puzzle. Lorsque l'application de la piscine de mon serveur a été recyclées (configuré par le fournisseur d'hébergement), l'état d'affichage de la clé de cryptage est d'être auto-re-généré. Cela signifie que même si les cookies ont été valide & non échues (pré-visite de retour), lorsque l'utilisateur a renvoyé l'encyrption avait changé, et le cookie n'est plus valide.
La solution a été de spécifier manuellement une statique de la clé de validation. Le lien suivant peut être utilisé pour générer les agréments nécessaires web.config balise pour ce.
http://www.aspnetresources.com/tools/keycreator.aspx
Mise à JOUR:
Voici un plus configurable site pour générer une Clé Machine
Source de l'Arbre - Generage attribut
Je me rends compte que cela pourrait avoir un mineur impact de sécurité, je suppose que théoriquement il est plus sûr d'avoir un changement de clé dans le cas où votre clé s'brute forcé et les compromis, toutes les données que vous pourriez être stocker dans l'état d'affichage, mais vous ne devriez probablement pas le stockage d'informations sensibles dans le viewstate comme il n'est pas intrinsèquement sûr de toute façon.
Exemple:
Je pense que vous auriez mieux-off à l'aide de la
FormsAuthentication.SetAuthCookie
méthode plutôt que d'écrire beaucoup de code vous-même.Je crois que votre fournisseur d'appartenances paramètres dans le web.config peut être en conflit avec les paramètres que vous fournissez dans le code, de plus, vous n'êtes pas fournir un nom de cookie.
Essayez ce qui suit:
En conjonction avec les paramètres suivants dans le web.config:
Il suffit de modifier le "délai d'attente" de la valeur dans le bloc d'authentification à un plus de valeur si vous voulez vraiment créer un indéfinie journal de période. Je crois que de 432 000 = 5 jours.
Si vous souhaitez que vos utilisateurs puissent explicitement la session, il suffit d'appeler la méthode suivante en réponse à un clic sur un bouton (ou autre):
Espère que cette aide.
Lecture de votre code, vous pourriez avoir accidentellement mis le FormsAuthenticationTicket valeur de temporisation à zéro. La ligne de votre code lorsque vous créez le billet de lit: -
La valeur de
Expiration.Subtract(Expiration).TotalMinutes
sera toujours à "0".Vous peut-être mieux à l'aide de la main de format pour la création du billet comme suit ce qui aurait pour résultat moins d'ambiguïté.
Il y a aussi un bon article de base de connaissances Microsoft ici sur "Comprendre les Formulaires de Ticket d'Authentification et de Témoin"
.