2012-01-14 66 views
5

使用ASP.NET成员资格,如果我想获取当前用户的信息,我可以拨打MembershipUser.GetUser()ASP.NET成员资格:当前用户标识存储在哪里?

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

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

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

回答

0

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

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

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

+0

membershipuser应该拥有一个可以强制转换的ProviderUserKey属性(Guid),假定您使用的是SQLMembershipProvider。 – PilotBob 2014-10-21 19:46:12

0

您可以使用MembershipUser.UserName获取用户ID或尝试调用Membership.GetUser(User.Identity.Name)并查看它是否适用于您。

+0

不,那是用户名,而不是ID。我的问题是如何在不检索所有用户的数据的情况下得到这个数据,这正是您的建议。 – 2012-01-14 04:52:32

+0

尝试使用我在编辑'Membership.GetUser(User.Identity.Name)' – 2012-01-14 04:56:23

+0

后发布的内容您已经描述了多种方法来完成我*不想*做的事情。也许你没有阅读我的问题。 – 2012-01-14 04:57:56

10

简短的回答是不,你不能只得到用户ID没有检索当你使用内置的成员资格提供整个用户信息,只能由这个

MembershipUser user = Membership.GetUser(); 
    string UserID = user.ProviderUserKey.ToString(); 

但是,如果你想有方法或财产仅检索用户ID,您必须重新实现您自己的成员资格提供者,或者(简单地)实现IPrincipal接口

1

正如你所猜测的,Membership API不支持你想要的东西。在过去,我使用了一个辅助类而不是创建自己的提供者。在这种情况下,这是很简单的,也许是这样的:调用GetUser()

+0

我正在寻找的是更轻的重量,因为我可以看到ASP.NET正在缓存这些信息。我真的没有看到使用你的代码比像'Membership.GetUser()。ProviderUserKey'简单的任何优势。 – 2012-01-14 17:36:14

+0

如果您查看'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

+0

我不确定我是否明白你的观点。是的,'Membership.GetUser()'返回整个用户记录 - 我原本想看看是否可以避免。但看看你发布的代码的复杂性,我只是没有看到它会更快。所以我不确定我真的看到了很大的优势。对不起,我错过了关于'ntext'的观点。为什么会是一个问题? (我正在使用关于所有事情的最新版本。) – 2012-01-15 00:59:22

0

考虑当

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; 

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