2

我想知道 SimpleMembership 是否将 UserId 保留在某个地方,或者如果没有,一旦派生数据,如何强制它保留。

我有简单的动作:

    [Authorize(Roles="User")]
    public ActionResult Create()
    {
        var ownerId = WebSecurity.GetUserId(User.Identity.Name);
        return View()
    }

我的 MiniProfiler 说:

 DECLARE @0 nvarchar(4) = N'NICK'
 SELECT [UserId] FROM [UserProfile] WHERE (UPPER([UserName]) = @0)   

 DECLARE @0 int = 2
 SELECT r.RoleName FROM webpages_UsersInRoles u, webpages_Roles r Where 
 (u.UserId = @0 and u.RoleId = r.RoleId) GROUP BY RoleName 

 DECLARE @0 nvarchar(4) = N'NICK'
 SELECT [UserId] FROM [UserProfile] WHERE (UPPER([UserName]) = @0)  

所以,我重复了对 UserId 的查询——首先是获取角色,其次是调用WebSecurity.GetUserId(User.Identity.Name);. 调用 [Authorize] 后,是否有一种聪明的方法可以将 UserId 保存在某处?

4

1 回答 1

4

我通常将我的用户配置文件包装在会话变量中。

 public static userProfile UserInfo
 {
     get { return HttpContext.Current.Session["UserInfo"] as userProfile; }
     set { HttpContext.Current.Session["UserInfo"] = value; }
 }

用户登录后查询UserProfile表并执行

UserInfo = QueryAsClass; //you need to map your sql to an object

一旦在那里,您可以随时访问它

UserInfo.userId

userProfile在我的应用程序中将表作为对象类

编辑

我有在用户登录后执行的代码

using (var db = new DBEntities())
    {
        var userId = WebSecurity.GetUserId(HttpContext.Current.User.Identity.Name);
        if (userId == -1) return;
        SessionHelpers.UserInfo = db.userProfiles.Single(x => x.userId == userId);
    }

我正在使用 EF5,并且我的userProfile模型中有表格,因此如果您不使用 EF,则需要调整这部分。

当我需要的时候,userId我就去做SessionHelpers.UserInfo.userId。这让我可以在需要时获取所有用户的个人资料信息,而无需重新查询数据库。

当然,如果您更改用户配置文件中的某些内容,您也需要更新会话变量。

您可能需要更高级的逻辑并检查会话是否为空(我正在其他地方做)。

于 2012-12-06T19:52:47.697 回答