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