我应该在哪里存储“MemberID”?

时间:2011-04-10 14:20:41

标签: asp.net

在我的网页中,我使用FormsAuthentication

FormsAuthentication.RedirectFromLoginPage(VisitorEmail, False)

每次访问者通过登录页面进行身份验证时,我都会设置

Session("MemberID") = GetMemberIDByEmail(VisitorEmail)以便以后处理。

因为我需要MemberIDVisitorEmail

但是有些东西告诉我这是“出书”而不是“按书”。

我在做错事还是做错了?

4 个答案:

答案 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.UserContext.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不太可能更改,那么用于表单身份验证似乎更有价值....并且您始终可以从值中查找电子邮件地址。