管理Membership.GetUser()。ProviderUserKey的多个调用;

时间:2012-06-04 14:36:49

标签: asp.net-mvc-3 security model-view-controller asp.net-membership

我昨天在想如何解决这个问题,因为我提供或检查用户的所有内容都取决于他的ProviderUserKey(ID)。

所以我做了一个像

这样的静态函数
public static Guid GetUserID()
{
    string UserID = string.Empty;

    if(HttpContext.Current.Session["UserID"] != null)
    {
        UserID = HttpContext.Current.Session["UserID"].ToString();
    }


    if(!string.IsNullOrEmpty(UserID))
    {
        return new Guid(UserID);
    }

    UserID = Membership.GetUser().ProviderUserKey.ToString();
    HttpContext.Current.Session["UserID"] = UserID;
    return new Guid(UserID);
}

此类的要点是减少数据库连接以检查/获取用户ID。

我的这个功能的问题不在于这不起作用,我的问题是如果登录用户注销并使用其他帐户登录?

或者在登录时添加会话值并在注销时清除会话值是否更好?

在哪里可以看到此类“获取用户ID”的任何其他问题?

2 个答案:

答案 0 :(得分:0)

您是否尝试过使用ProfileProvider?

您可以使用和使用特殊属性进行自定义,并且每个用户都可以通过会话进行管理。

获取值的示例:

HttpContext.Profile.GetPropertyValue["CustomProperty"]

在此视频中,您可以精益实施,创建,配置和使用......

http://www.asp.net/web-forms/videos/how-do-i/how-do-i-create-a-custom-profile-provider

答案 1 :(得分:0)

如果您将用户注销,那么您也应该终止该会话。 当您以其他用户身份登录时,您也可以重新初始化会话。

请注意,您希望保持会话并形成身份验证超时(假设您使用表单身份验证)彼此同步:

How can I handle forms authentication timeout exceptions in ASP.NET?

这应该有助于使会话与表单身份验证令牌保持一致。您将需要在注销时终止会话并在登录时初始化它。

另一种方法是实现您自己的成员资格提供程序,缓存此密钥以防止持续的db命中。