使用ASP.NET成员资格,如果我想获取当前用户的信息,我可以致电MembershipUser.GetUser()
因此,系统必须知道当前用户的ID。
如果这是正确的,并且我想要的只是当前用户的ID,有没有办法在不从数据库返回所有用户信息的情况下获取它?
我知道我可以使用User.Identity.Name
获取当前用户的用户名,但我需要ID。
答案 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()
答案 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)