使用ASP.NET成員資格,如果我想獲取當前用戶的信息,我可以撥打MembershipUser.GetUser()
ASP.NET成員資格:當前用戶標識存儲在哪裏?
因此,系統必須知道當前用戶的ID。
如果這是正確的,並且我想要的只是當前用戶的ID,有沒有辦法在不從數據庫返回所有用戶信息的情況下獲取它?
我知道我可以使用User.Identity.Name
獲得當前用戶的用戶名,但我需要該ID。
使用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