Wie zum speichern benutzerdefinierter Daten in ASP.NET die Mitgliedschaft Cookie
Kann mir jemand ein Beispiel (oder zeigen Sie mich in die richtige Richtung) auf, wie zum speichern benutzerdefinierter Daten in einer ASP.NET die Mitgliedschaft cookie?
Muss ich hinzufügen einige benutzerdefinierte Eigenschaften wie UserID und URLSlug dem cookie und in der Lage sein, die Informationen abzurufen, die in der gleichen Weise würde man abrufen des Benutzernamens.
Edit:
Ich verwendete Code-Poet ' s Beispiel und kam mit der folgenden.
Wenn ich ein breakpoint auf Dim SerializedUser As String = SerializeUser(userData)
den Wert userData
richtig ist. Es hat alle Eigenschaften, die ich erwartet habe.
Das problem ich bin jetzt in ist, dass wenn ich Dim userdata As String = authTicket.UserData
(Haltepunkt), der Wert ist ""
. Ich würde gerne herausfinden, was ich falsch mache.
Hier ist der code.
Imports System
Imports System.Web
Imports System.Web.Security
Namespace Utilities.Authentication
Public NotInheritable Class CustomAuthentication
Private Sub New()
End Sub
Public Shared Function CreateAuthCookie(ByVal userName As String, ByVal userData As Domain.Models.UserSessionModel, ByVal persistent As Boolean) As HttpCookie
Dim issued As DateTime = DateTime.Now
''# formsAuth does not expose timeout!? have to hack around the
''# spoiled parts and keep moving..
Dim fooCookie As HttpCookie = FormsAuthentication.GetAuthCookie("foo", True)
Dim formsTimeout As Integer = Convert.ToInt32((fooCookie.Expires - DateTime.Now).TotalMinutes)
Dim expiration As DateTime = DateTime.Now.AddMinutes(formsTimeout)
Dim cookiePath As String = FormsAuthentication.FormsCookiePath
Dim SerializedUser As String = SerializeUser(userData)
Dim ticket = New FormsAuthenticationTicket(0, userName, issued, expiration, True, SerializedUser, cookiePath)
Return CreateAuthCookie(ticket, expiration, persistent)
End Function
Public Shared Function CreateAuthCookie(ByVal ticket As FormsAuthenticationTicket, ByVal expiration As DateTime, ByVal persistent As Boolean) As HttpCookie
Dim creamyFilling As String = FormsAuthentication.Encrypt(ticket)
Dim cookie = New HttpCookie(FormsAuthentication.FormsCookieName, creamyFilling) With { _
.Domain = FormsAuthentication.CookieDomain, _
.Path = FormsAuthentication.FormsCookiePath _
}
If persistent Then
cookie.Expires = expiration
End If
Return cookie
End Function
Public Shared Function RetrieveAuthUser() As Domain.Models.UserSessionModel
Dim cookieName As String = FormsAuthentication.FormsCookieName
Dim authCookie As HttpCookie = HttpContext.Current.Request.Cookies(cookieName)
Dim authTicket As FormsAuthenticationTicket = FormsAuthentication.Decrypt(authCookie.Value)
Dim userdata As String = authTicket.UserData
Dim usersessionmodel As New Domain.Models.UserSessionModel
usersessionmodel = DeserializeUser(userdata)
Return usersessionmodel
End Function
Private Shared Function SerializeUser(ByVal usersessionmodel As Domain.Models.UserSessionModel) As String
Dim bf As New Runtime.Serialization.Formatters.Binary.BinaryFormatter()
Dim mem As New IO.MemoryStream
bf.Serialize(mem, usersessionmodel)
Return Convert.ToBase64String(mem.ToArray())
End Function
Private Shared Function DeserializeUser(ByVal serializedusersessionmodel As String) As Domain.Models.UserSessionModel
Dim bf As New Runtime.Serialization.Formatters.Binary.BinaryFormatter()
Dim mem As New IO.MemoryStream(Convert.FromBase64String(serializedusersessionmodel))
Return DirectCast(bf.Deserialize(mem), Domain.Models.UserSessionModel)
End Function
End Class
End Namespace
Hier, wo ich eine erstellen, die alle Magie. Diese Methode ist in einer "BaseController" - Klasse, die erbt System.Web.Mvc.Controller
Protected Overrides Function CreateActionInvoker() As System.Web.Mvc.IActionInvoker
If User.Identity.IsAuthenticated Then ''# this if statement will eventually also check to make sure that the cookie actually exists.
Dim sessionuser As Domain.Models.UserSessionModel = New Domain.Models.UserSessionModel(OpenIdService.GetOpenId(HttpContext.User.Identity.Name).User)
HttpContext.Response.Cookies.Add(UrbanNow.Core.Utilities.Authentication.CustomAuthentication.CreateAuthCookie(HttpContext.User.Identity.Name, sessionuser, True))
End If
End Function
Und hier ist, wie ich versuchen und abrufen der info.
Dim user As Domain.Models.UserSessionModel = CustomAuthentication.RetrieveAuthUser
- Ich fand die Antwort auf die Frage. Der obige code funktioniert, jedoch die
Response.Cookies.Add
war nicht arbeiten, weil es passiert war in der falschen Stelle. Das cookie wurde bereits erstellt, in der Schritt-Authentifizierung. Ich hatte den code entfernen, erstellt der code in der Auth Schritt und ersetzen Sie es mit dem code in der CreateActionInvoker Methode.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Je nach Szenario, mit einem separaten cookie könnte eine sinnvolle option sein, aber meiner Meinung nach suboptimal aus mehreren Gründen, einschließlich der Tatsache, das Sie verwalten mehrere cookies sowie die Verwaltung der Lebensdauer des Cookies.
Den meisten zuverlässige Strategie für die Einbeziehung von benutzerdefinierten Informationen in Ihren Formen, ticket ist die Nutzung der
userData
Feld des Tickets. Das ist genau das, was es dort für.Können Sie einfach speichern Sie benutzerdefinierte Daten in die
userData
Feld des Tickets.Gibt es ein paar Bedenken bewusst zu sein in Bezug auf die Größe der Daten, die gespeichert werden in dem ticket, das erklärt hier
Und hier ist eine kleine Klasse, die helfen können, die Aufgabe der Speicherung von benutzerdefinierten Daten in Ihre Formulare ticket.
ID, RegionID, Username, Slug
, schicke ich, dass dieuserData
Objekt in einer Komma-getrennten string, oder muss ich, wie einige searialzie es und steckte es in dort?CreateActionInvoker
Methode der BaseController erbt dieSystem.Web.Mvc.Controller
. Dann habe ichRetrieveAuthUser
in meinem ControllerActionResult
FormsAuthentication.SetAuthCookie
Zunächst ASP.Net die Mitgliedschaft Anbieter, nicht schreiben, keine cookies, diese cookies werden geschrieben von FormsAuthentication.
Und zweitens, warum einmischen in die Authentifizierungs-cookie. Sie können dies tun, in einem separaten cookie zusammen. Hier ist, wie können Sie das tun.
Schreiben die Schlüssel-Werte in cookie.
Lesen Sie die Schlüssel-Werte von cookie.
Schreiben die Schlüssel-Werte in cookie.
Lesen Sie die Schlüssel-Werte von cookie.
User.Identity.Slug
zu erwerben, die Benutzer slug?