在我的网页中,我使用FormsAuthentication
FormsAuthentication.RedirectFromLoginPage(VisitorEmail, False)
每次访问者通过登录页面进行身份验证时,我都会设置
Session("MemberID") = GetMemberIDByEmail(VisitorEmail)
以便以后处理。
因为我需要MemberID
和VisitorEmail
。
但是有些东西告诉我这是“出书”而不是“按书”。
我在做错事还是做错了?
答案 0 :(得分:4)
抱歉,我不确定您要从您的描述中确切地做些什么,但是不需要将MemberID存储在会话状态中。无论何时需要,只需致电:
Membership.GetUser.ProviderUserKey
注意:在会话状态下存储信息并不是真正的好形式,因为这可能会丢失,例如如果Web服务器重置 - 它定期执行,或者站点需要重新编译。此外,它的可扩展性不高,因为每个“活动”用户都会耗尽内存,如果您需要转移到Web场会话状态,则会导致问题,因为每个Web服务器上都会出现问题。
虽然可以提供一个小的,快速的网站,然后确认; - )
答案 1 :(得分:3)
使用Session来缓存此类信息是可以的,但是当会话在Global.asax中到期时,请记得重新分配:
void Session_Start(object sender, EventArgs e)
{
if(Request.IsAuthenticated) //to make sure the user has not logged out
Session["MemberID"] = GetMemberIDByEmail(VisitorEmail);
}
答案 2 :(得分:1)
您可以创建自定义主体类,以便添加其他属性。然后修改您的Global.asax以使用您的代码覆盖Application_PostAuthenticateRequest
并设置Context.User = Thread.CurrentPrincipal = myPrincipal;
。最好是始终设置Thread.CurrentPrincipal
,但通常您还可以使用更“方便”的Page.User
或Context.User
访问代码中其他位置的属性。
答案 3 :(得分:0)
你能否切换两个并将成员id存储在表单变量中(因为我假设用户能够更改那里的电子邮件地址而不是成员ID)...
Dim memberId as Integer = GetMemberIDByEmail(VisitorEmail)
' assuming integer here and that a result is found etc etc
' set the form authentication stuff
FormsAuthentication.RedirectFromLoginPage(memberId, False)
然后你总是可以从memberId中查找电子邮件地址(可能会根据请求对成员ID进行缓存)
Public Function GetMemberEmail(Byval memberId as Integer) As String
Dim cacheKey as String = "member-email-" & memberId
Dim email as String
If Cache.Item(cacheKey) is Nothing Then
email = GetMemberEmailByID(memberId)
Cache.Insert(cacheKey, email ...
Else
email = Cache.Item(cacheKey)
End If
return email
End Function
如果您需要这两条信息,并且ID不太可能更改,那么用于表单身份验证似乎更有价值....并且您始终可以从值中查找电子邮件地址。