ASP.NET成员资格:存储当前用户ID的位置?

时间:2012-01-14 04:48:50

标签: asp.net asp.net-membership

使用ASP.NET成员资格,如果我想获取当前用户的信息,我可以致电MembershipUser.GetUser()

因此,系统必须知道当前用户的ID。

如果这是正确的,并且我想要的只是当前用户的ID,有没有办法在不从数据库返回所有用户信息的情况下获取它?

我知道我可以使用User.Identity.Name获取当前用户的用户名,但我需要ID。

6 个答案:

答案 0 :(得分:10)

简短的回答是,当您使用内置成员资格提供程序时,只有通过此

才能获取用户ID而不检索整个用户信息
    MembershipUser user = Membership.GetUser();
    string UserID = user.ProviderUserKey.ToString();

但是如果你想拥有只检索userID的方法或属性,你必须重新实现自己的成员资格提供者或(简单地说)实现IPrincipal接口

答案 1 :(得分:2)

要返回UserId,请使用控制器中的命令bellow:

User.Identity.GetUserId();

要返回UserName,请使用:

User.Identity.Name;

要返回用户:

var user = db.Users.Find(User.Identity.GetUserId());

请参阅帖子:How to get current user, and how to use User class in MVC5?

答案 2 :(得分:1)

正如您所猜测的,Membership API不支持您想要的开箱即用。在过去,我使用了辅助类而不是创建自己的提供程序。在这种情况下,它非常简单,可能是这样的:

public static object GetUserId() {
  return GetUserId(HttpContext.Current.User.Identity.Name, true);
}    
public static object GetUserId(string userName) {
  return GetUserId(userName, true);
}
public static object GetUserId(string userName, bool UpdateLastActivity) {
  using (SqlConnection c = new SqlConnection(CONNECTION_STRING)) {
    string sql = @"
DECLARE @UserId uniqueidentifier
SELECT @UserId=u.UserId
FROM dbo.aspnet_Applications AS a
  ,dbo.aspnet_Users AS u
  ,dbo.aspnet_Membership AS m
WHERE
  a.LoweredApplicationName=LOWER(@ApplicationName)
  AND u.ApplicationId=a.ApplicationId
  AND u.LoweredUserName=LOWER(@UserName)
  AND u.UserId=m.UserId;
IF @UserId IS NOT NULL AND @UpdateLastActivity=1
  UPDATE dbo.aspnet_Users
  SET LastActivityDate=@CurrentTimeUtc
  WHERE UserId=@UserId;
SELECT @UserId  
      ";
    using (SqlCommand cmd = new SqlCommand(sql, c)) {
      cmd.Parameters.AddWithValue("@ApplicationName", Roles.ApplicationName);
      cmd.Parameters.AddWithValue("@UserName", userName);
      cmd.Parameters.AddWithValue("@UpdateLastActivity", UpdateLastActivity);
      cmd.Parameters.AddWithValue("@CurrentTimeUtc", DateTime.UtcNow);
      object id = null;
      c.Open();
      id = cmd.ExecuteScalar();
      return id != DBNull.Value ? id : null;
    }
  }
}

上面与调用GetUser()

时在Membership API中完成的工作非常相似

答案 3 :(得分:0)

您可以使用MembershipUser.UserName获取用户ID或尝试拨打Membership.GetUser(User.Identity.Name),看看是否适合您。

答案 4 :(得分:0)

在进一步研究之后,似乎ASP.NET Membership API根本不跟踪用户ID。它必须仅跟踪用户名(User.Identity.Name)。该ID不是必需的,因为Membership.GetUser()可以从ID 用户名中找到用户。

事实上,Membership.GetUser()必须简单地翻译为Membership.GetUser(User.Identity.Name)。由于它可以从用户名获取当前用户,因此不再有任何理由认为当前用户ID已缓存在任何地方。

因此看起来ID没有加载到内存中,获取ID的唯一方法是从数据库加载数据(这意味着在使用ASP.NET Membership API时加载整个用户记录)。

答案 5 :(得分:0)

考虑

int userId = WebSecurity.CurrentUserId;

信用:https://stackoverflow.com/a/15382691/1268910