Asp.net “我应该在哪里储存?”;MemberID";?

Asp.net “我应该在哪里储存?”;MemberID";?,asp.net,Asp.net,在我的网页中,我使用FormsAuthentication FormsAuthentication.RedirectFromLoginPage(VisitorEmail, False) 每次访问者通过登录页面进行身份验证时,我都会设置 Session(“MemberID”)=GetMemberIDByEmail(VisitorEmail)供以后处理 因为我需要MemberID和VisitorEmail 但有些东西告诉我,这是“书外”而不是“按书” 那么,我在这里做了什么错事或坏事吗?您可以创建

在我的网页中,我使用FormsAuthentication

FormsAuthentication.RedirectFromLoginPage(VisitorEmail, False)
每次访问者通过登录页面进行身份验证时,我都会设置

Session(“MemberID”)=GetMemberIDByEmail(VisitorEmail)
供以后处理

因为我需要
MemberID
VisitorEmail

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


那么,我在这里做了什么错事或坏事吗?

您可以创建一个自定义主体类,以便添加其他属性。然后修改Global.asax以用代码覆盖
应用程序\u PostAuthenticateRequest
,并设置
Context.User=Thread.CurrentPrincipal=myPrincipal。最好的方法是始终设置
Thread.CurrentPrincipal
,但通常您也可以使用更“方便”的
页面在代码的其他地方访问自己的属性。User
Context.User


  • /
  • /

抱歉,根据您的描述,我不确定您到底想做什么,但不需要将MemberID存储在会话状态。无论何时需要,只要打电话:

Membership.GetUser.ProviderUserKey

注意:将信息存储在会话状态并不是很好的形式,因为这可能会丢失,例如,如果web服务器定期重置,或者如果站点需要重新编译。此外,它的可伸缩性不是很强,因为每个“活动”用户都会使用内存,而且如果您需要移动到web场会话状态,可能会导致问题,因为每个web服务器上的会话状态都不同


不过,对于一个小而快速的站点来说,这个问题还可以;-)

您能否切换这两个变量并将成员id存储在表单变量中(因为我假设用户能够更改那里的电子邮件地址而不是那里的成员id)

然后,您可以始终从memberId中查找电子邮件地址(可能会根据请求中的成员id进行缓存)


如果您同时需要这两条信息,并且Id不太可能更改,那么将其用于表单身份验证似乎是更好的值……而且您始终可以从该值中查找电子邮件地址。

可以使用会话缓存此类信息,但请记住在全局会话过期时重新分配它。asax:

void Session_Start(object sender, EventArgs e) 
{
    if(Request.IsAuthenticated) //to make sure the user has not logged out
        Session["MemberID"] = GetMemberIDByEmail(VisitorEmail);
}

我不确定这不是“按规定”的。如果你需要身份证和电子邮件,你需要两者,你需要把它放在某个地方,并支付所有相关费用。你可能应该重新考虑一下你的逻辑,看看你是否可以只删除电子邮件——因为两者都是独一无二的,而且是直接的一对一映射,理论上你只需要保留一个。什么?可以使用该会话。这就是它的目的。如果您使用的是web场,只需将会话状态配置为存储在SQL Server中,而不是使用默认的InProc会话管理。如果您担心编译问题,这也会解决编译问题。我应该补充一点,就最初的问题而言,Membership.GetUser.ProviderUserKey也是我要做的谢谢Charlie-是的,也许我对使用会话状态有点过于谨慎了。我想,对于瞬态数据来说,这是很好的,将其推到DB中是一种可能性——但如果你能避免它,那就太好了,我认为在这种情况下这是可能的(praps只是我自己的痛苦经历!)
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
void Session_Start(object sender, EventArgs e) 
{
    if(Request.IsAuthenticated) //to make sure the user has not logged out
        Session["MemberID"] = GetMemberIDByEmail(VisitorEmail);
}