我有一个遗留的UserID(int32),我想链接到asp.net会员。我在数据库上设置了链接表,我对这部分感到满意。问题是将UserID存储在Web应用程序中的位置,以便在需要时可以轻松访问。
我决定存储它的最佳位置是Login Control的LoggedIn事件中FormsAuthenticationTicket的UserData部分。我第一次尝试使其可访问是在我的BasePage类的PreInit中提取它。这样做的问题是当UserControls需要UserID时它会变得混乱。
将它包装在Utilities类中的静态方法或属性中是否可以接受,如下所示:
public static int UserID
{
get
{
int userID = 0;
if (HttpContext.Current.User.Identity is FormsIdentity)
{
FormsIdentity id = (FormsIdentity)HttpContext.Current.User.Identity;
FormsAuthenticationTicket ticket = id.Ticket;
userID = Int32.Parse(ticket.UserData);
}
return userID;
}
}
这似乎有效,但我不知道我是否打破了一些不成文的规则。我假设所有这些东西都在内存中,所以这次访问没有很大的开销。
答案 0 :(得分:3)
从功能的角度看你的代码看起来很好(虽然我会稍微清理一下,但这更像是一种风格)。
您可能会考虑将其作为扩展方法,而不是仅仅将其粘贴到随机实用程序类中。也许是IIdentity
类的扩展名?
int myUserId = HttpContext.Current.User.Identity.MyUserId();
我想,使用UserData
字段很好。另一个选择是使用自定义IIdentity
创建您自己的Ticket
对象并将其包装在GenericPrincipal
中 - 但是对于您所追求的内容可能过于繁重。