2012-01-14 50 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