ASP.NET成员资格:当前用户标识存储在哪里?
使用ASP.NET成员资格,如果我想获取当前用户的信息,我可以拨打MembershipUser.GetUser()
ASP.NET成员资格:当前用户标识存储在哪里?
因此,系统必须知道当前用户的ID。
如果这是正确的,并且我想要的只是当前用户的ID,有没有办法在不从数据库返回所有用户信息的情况下获取它?
我知道我可以使用User.Identity.Name
获得当前用户的用户名,但我需要该ID。
进一步研究之后,似乎ASP.NET Membership API毕竟不跟踪用户ID。它只能跟踪用户名(User.Identity.Name
)。该ID不是必需的,因为Membership.GetUser()
可以从ID 或用户名中找到用户。
实际上,Membership.GetUser()
必须简单翻译为Membership.GetUser(User.Identity.Name)
。由于它可以从用户名获取当前用户,因此不再有任何理由认为当前用户标识被缓存在任何地方。
因此,它似乎没有加载到内存中,并且获得该ID的唯一方法是从数据库加载数据(这意味着在使用ASP.NET Membership API时加载整个用户记录)。
您可以使用MembershipUser.UserName
获取用户ID或尝试调用Membership.GetUser(User.Identity.Name)
并查看它是否适用于您。
不,那是用户名,而不是ID。我的问题是如何在不检索所有用户的数据的情况下得到这个数据,这正是您的建议。 – 2012-01-14 04:52:32
尝试使用我在编辑'Membership.GetUser(User.Identity.Name)' – 2012-01-14 04:56:23
后发布的内容您已经描述了多种方法来完成我*不想*做的事情。也许你没有阅读我的问题。 – 2012-01-14 04:57:56
简短的回答是不,你不能只得到用户ID没有检索当你使用内置的成员资格提供整个用户信息,只能由这个
MembershipUser user = Membership.GetUser();
string UserID = user.ProviderUserKey.ToString();
但是,如果你想有方法或财产仅检索用户ID,您必须重新实现您自己的成员资格提供者,或者(简单地)实现IPrincipal接口
正如你所猜测的,Membership API不支持你想要的东西。在过去,我使用了一个辅助类而不是创建自己的提供者。在这种情况下,这是很简单的,也许是这样的:调用GetUser()
我正在寻找的是更轻的重量,因为我可以看到ASP.NET正在缓存这些信息。我真的没有看到使用你的代码比像'Membership.GetUser()。ProviderUserKey'简单的任何优势。 – 2012-01-14 17:36:14
如果您查看'aspnetdb'数据库中的'aspnet_Membership_GetUserByName'存储过程,则查询的其中一个字段具有'ntext'数据类型。你没有详细说明你的设置是什么,所以这可能会也可能不是问题。但是,您错过了调用'Membership.GetUser()。ProviderUserKey'的观点。你得到用户ID,但是'Membership.GetUser()'**正在执行**'aspnet_Membership_GetUserByName' - 通过SQL Server Profiler运行它来确认。尽管如此,从来没有打扰过检查ASP.NET缓存的内容。 – kuujinbo 2012-01-14 18:02:20
我不确定我是否明白你的观点。是的,'Membership.GetUser()'返回整个用户记录 - 我原本想看看是否可以避免。但看看你发布的代码的复杂性,我只是没有看到它会更快。所以我不确定我真的看到了很大的优势。对不起,我错过了关于'ntext'的观点。为什么会是一个问题? (我正在使用关于所有事情的最新版本。) – 2012-01-15 00:59:22
考虑当
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 [email protected]
WHERE [email protected];
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;
}
}
}
以上是非常相似什么是会员API中做
int userId = WebSecurity.CurrentUserId;
要返回UserId,请使用控制器中的命令波纹管:
User.Identity.GetUserId();
要返回用户名,使用:
User.Identity.Name;
若要恢复用户:
var user = db.Users.Find(User.Identity.GetUserId());
请参考后:How to get current user, and how to use User class in MVC5?
membershipuser应该拥有一个可以强制转换的ProviderUserKey属性(Guid),假定您使用的是SQLMembershipProvider。 – PilotBob 2014-10-21 19:46:12