Is User.Identity.GetUserId cached or does it fetch from the database every time?

牧云@^-^@ 提交于 2019-12-21 13:07:52

问题


I'm using ASP.Net MVC 5 and I'm calling this line all over my code

string userId = User.Identity.GetUserId();

Does ASP.NET MVC go and fetch this from the table for each call, or does it get cached?


回答1:


It seems that the id along with the username are cached when you login.

I've used SQL Server Profiler and after logged in running User.Identity.GetUserId(); the identity system made no queries to the database.

This is the query made on loggin:

exec sp_executesql N'SELECT 
    [UnionAll2].[C2] AS [C1], 
    [UnionAll2].[C3] AS [C2], 
    [UnionAll2].[C4] AS [C3], 
    [UnionAll2].[C5] AS [C4], 
    [UnionAll2].[C6] AS [C5], 
    [UnionAll2].[C7] AS [C6], 
    [UnionAll2].[C8] AS [C7], 
    [UnionAll2].[C9] AS [C8], 
    [UnionAll2].[C10] AS [C9], 
    [UnionAll2].[C11] AS [C10], 
    [UnionAll2].[C12] AS [C11], 
    [UnionAll2].[C13] AS [C12], 
    [UnionAll2].[C14] AS [C13], 
    [UnionAll2].[C1] AS [C14], 
    [UnionAll2].[C15] AS [C15], 
    [UnionAll2].[C16] AS [C16], 
    [UnionAll2].[C17] AS [C17], 
    [UnionAll2].[C18] AS [C18], 
    [UnionAll2].[C19] AS [C19], 
    [UnionAll2].[C20] AS [C20], 
    [UnionAll2].[C21] AS [C21], 
    [UnionAll2].[C22] AS [C22], 
    [UnionAll2].[C23] AS [C23], 
    [UnionAll2].[C24] AS [C24], 
    [UnionAll2].[C25] AS [C25]
    FROM  (SELECT 
        [UnionAll1].[C1] AS [C1], 
        [UnionAll1].[AccessFailedCount] AS [C2], 
        [UnionAll1].[Id] AS [C3], 
        [UnionAll1].[Email] AS [C4], 
        [UnionAll1].[EmailConfirmed] AS [C5], 
        [UnionAll1].[PasswordHash] AS [C6], 
        [UnionAll1].[SecurityStamp] AS [C7], 
        [UnionAll1].[PhoneNumber] AS [C8], 
        [UnionAll1].[PhoneNumberConfirmed] AS [C9], 
        [UnionAll1].[TwoFactorEnabled] AS [C10], 
        [UnionAll1].[LockoutEndDateUtc] AS [C11], 
        [UnionAll1].[LockoutEnabled] AS [C12], 
        [UnionAll1].[AccessFailedCount1] AS [C13], 
        [UnionAll1].[UserName] AS [C14], 
        [UnionAll1].[UserId] AS [C15], 
        [UnionAll1].[RoleId] AS [C16], 
        [UnionAll1].[UserId1] AS [C17], 
        [UnionAll1].[C2] AS [C18], 
        [UnionAll1].[C3] AS [C19], 
        [UnionAll1].[C4] AS [C20], 
        [UnionAll1].[C5] AS [C21], 
        [UnionAll1].[C6] AS [C22], 
        [UnionAll1].[C7] AS [C23], 
        [UnionAll1].[C8] AS [C24], 
        [UnionAll1].[C9] AS [C25]
        FROM  (SELECT 
            CASE WHEN ([Extent2].[UserId] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C1], 
            [Limit1].[AccessFailedCount] AS [AccessFailedCount], 
            [Limit1].[Id] AS [Id], 
            [Limit1].[Email] AS [Email], 
            [Limit1].[EmailConfirmed] AS [EmailConfirmed], 
            [Limit1].[PasswordHash] AS [PasswordHash], 
            [Limit1].[SecurityStamp] AS [SecurityStamp], 
            [Limit1].[PhoneNumber] AS [PhoneNumber], 
            [Limit1].[PhoneNumberConfirmed] AS [PhoneNumberConfirmed], 
            [Limit1].[TwoFactorEnabled] AS [TwoFactorEnabled], 
            [Limit1].[LockoutEndDateUtc] AS [LockoutEndDateUtc], 
            [Limit1].[LockoutEnabled] AS [LockoutEnabled], 
            [Limit1].[AccessFailedCount] AS [AccessFailedCount1], 
            [Limit1].[UserName] AS [UserName], 
            [Extent2].[UserId] AS [UserId], 
            [Extent2].[RoleId] AS [RoleId], 
            [Extent2].[UserId] AS [UserId1], 
            CAST(NULL AS int) AS [C2], 
            CAST(NULL AS varchar(1)) AS [C3], 
            CAST(NULL AS varchar(1)) AS [C4], 
            CAST(NULL AS varchar(1)) AS [C5], 
            CAST(NULL AS varchar(1)) AS [C6], 
            CAST(NULL AS varchar(1)) AS [C7], 
            CAST(NULL AS varchar(1)) AS [C8], 
            CAST(NULL AS varchar(1)) AS [C9]
            FROM   (SELECT TOP (1) 
                [Extent1].[Id] AS [Id], 
                [Extent1].[Email] AS [Email], 
                [Extent1].[EmailConfirmed] AS [EmailConfirmed], 
                [Extent1].[PasswordHash] AS [PasswordHash], 
                [Extent1].[SecurityStamp] AS [SecurityStamp], 
                [Extent1].[PhoneNumber] AS [PhoneNumber], 
                [Extent1].[PhoneNumberConfirmed] AS [PhoneNumberConfirmed], 
                [Extent1].[TwoFactorEnabled] AS [TwoFactorEnabled], 
                [Extent1].[LockoutEndDateUtc] AS [LockoutEndDateUtc], 
                [Extent1].[LockoutEnabled] AS [LockoutEnabled], 
                [Extent1].[AccessFailedCount] AS [AccessFailedCount], 
                [Extent1].[UserName] AS [UserName]
                FROM [dbo].[AspNetUsers] AS [Extent1]
                WHERE [Extent1].[Id] = @p__linq__0 ) AS [Limit1]
            LEFT OUTER JOIN [dbo].[AspNetUserRoles] AS [Extent2] ON [Limit1].[Id] = [Extent2].[UserId]
        UNION ALL
            SELECT 
            2 AS [C1], 
            [Limit2].[AccessFailedCount] AS [AccessFailedCount], 
            [Limit2].[Id] AS [Id], 
            [Limit2].[Email] AS [Email], 
            [Limit2].[EmailConfirmed] AS [EmailConfirmed], 
            [Limit2].[PasswordHash] AS [PasswordHash], 
            [Limit2].[SecurityStamp] AS [SecurityStamp], 
            [Limit2].[PhoneNumber] AS [PhoneNumber], 
            [Limit2].[PhoneNumberConfirmed] AS [PhoneNumberConfirmed], 
            [Limit2].[TwoFactorEnabled] AS [TwoFactorEnabled], 
            [Limit2].[LockoutEndDateUtc] AS [LockoutEndDateUtc], 
            [Limit2].[LockoutEnabled] AS [LockoutEnabled], 
            [Limit2].[AccessFailedCount] AS [AccessFailedCount1], 
            [Limit2].[UserName] AS [UserName], 
            CAST(NULL AS varchar(1)) AS [C2], 
            CAST(NULL AS varchar(1)) AS [C3], 
            CAST(NULL AS varchar(1)) AS [C4], 
            [Extent4].[Id] AS [Id1], 
            [Extent4].[UserId] AS [UserId], 
            [Extent4].[ClaimType] AS [ClaimType], 
            [Extent4].[ClaimValue] AS [ClaimValue], 
            CAST(NULL AS varchar(1)) AS [C5], 
            CAST(NULL AS varchar(1)) AS [C6], 
            CAST(NULL AS varchar(1)) AS [C7], 
            CAST(NULL AS varchar(1)) AS [C8]
            FROM   (SELECT TOP (1) 
                [Extent3].[Id] AS [Id], 
                [Extent3].[Email] AS [Email], 
                [Extent3].[EmailConfirmed] AS [EmailConfirmed], 
                [Extent3].[PasswordHash] AS [PasswordHash], 
                [Extent3].[SecurityStamp] AS [SecurityStamp], 
                [Extent3].[PhoneNumber] AS [PhoneNumber], 
                [Extent3].[PhoneNumberConfirmed] AS [PhoneNumberConfirmed], 
                [Extent3].[TwoFactorEnabled] AS [TwoFactorEnabled], 
                [Extent3].[LockoutEndDateUtc] AS [LockoutEndDateUtc], 
                [Extent3].[LockoutEnabled] AS [LockoutEnabled], 
                [Extent3].[AccessFailedCount] AS [AccessFailedCount], 
                [Extent3].[UserName] AS [UserName]
                FROM [dbo].[AspNetUsers] AS [Extent3]
                WHERE [Extent3].[Id] = @p__linq__0 ) AS [Limit2]
            INNER JOIN [dbo].[AspNetUserClaims] AS [Extent4] ON [Limit2].[Id] = [Extent4].[UserId]) AS [UnionAll1]
    UNION ALL
        SELECT 
        3 AS [C1], 
        [Limit3].[AccessFailedCount] AS [AccessFailedCount], 
        [Limit3].[Id] AS [Id], 
        [Limit3].[Email] AS [Email], 
        [Limit3].[EmailConfirmed] AS [EmailConfirmed], 
        [Limit3].[PasswordHash] AS [PasswordHash], 
        [Limit3].[SecurityStamp] AS [SecurityStamp], 
        [Limit3].[PhoneNumber] AS [PhoneNumber], 
        [Limit3].[PhoneNumberConfirmed] AS [PhoneNumberConfirmed], 
        [Limit3].[TwoFactorEnabled] AS [TwoFactorEnabled], 
        [Limit3].[LockoutEndDateUtc] AS [LockoutEndDateUtc], 
        [Limit3].[LockoutEnabled] AS [LockoutEnabled], 
        [Limit3].[AccessFailedCount] AS [AccessFailedCount1], 
        [Limit3].[UserName] AS [UserName], 
        CAST(NULL AS varchar(1)) AS [C2], 
        CAST(NULL AS varchar(1)) AS [C3], 
        CAST(NULL AS varchar(1)) AS [C4], 
        CAST(NULL AS int) AS [C5], 
        CAST(NULL AS varchar(1)) AS [C6], 
        CAST(NULL AS varchar(1)) AS [C7], 
        CAST(NULL AS varchar(1)) AS [C8], 
        [Extent6].[LoginProvider] AS [LoginProvider], 
        [Extent6].[ProviderKey] AS [ProviderKey], 
        [Extent6].[UserId] AS [UserId], 
        [Extent6].[UserId] AS [UserId1]
        FROM   (SELECT TOP (1) 
            [Extent5].[Id] AS [Id], 
            [Extent5].[Email] AS [Email], 
            [Extent5].[EmailConfirmed] AS [EmailConfirmed], 
            [Extent5].[PasswordHash] AS [PasswordHash], 
            [Extent5].[SecurityStamp] AS [SecurityStamp], 
            [Extent5].[PhoneNumber] AS [PhoneNumber], 
            [Extent5].[PhoneNumberConfirmed] AS [PhoneNumberConfirmed], 
            [Extent5].[TwoFactorEnabled] AS [TwoFactorEnabled], 
            [Extent5].[LockoutEndDateUtc] AS [LockoutEndDateUtc], 
            [Extent5].[LockoutEnabled] AS [LockoutEnabled], 
            [Extent5].[AccessFailedCount] AS [AccessFailedCount], 
            [Extent5].[UserName] AS [UserName]
            FROM [dbo].[AspNetUsers] AS [Extent5]
            WHERE [Extent5].[Id] = @p__linq__0 ) AS [Limit3]
        INNER JOIN [dbo].[AspNetUserLogins] AS [Extent6] ON [Limit3].[Id] = [Extent6].[UserId]) AS [UnionAll2]
    ORDER BY [UnionAll2].[C3] ASC, [UnionAll2].[C1] ASC',N'@p__linq__0 nvarchar(4000)',@p__linq__0=N'b73f9738-76ed-48d5-a8fd-cbf23a233fe9'



回答2:


Looking at the decompiled sources of Microsoft.AspNet.Identity.Core.dll, you can see that it retrieves the user id from the claims of the current identity. So it doesn't fetch this info from the database.

public static string GetUserId(this IIdentity identity)
{
  if (identity == null)
    throw new ArgumentNullException("identity");
  ClaimsIdentity identity1 = identity as ClaimsIdentity;
  if (identity1 != null)
    return IdentityExtensions.FindFirstValue(identity1, "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier");
  return (string) null;
}


来源:https://stackoverflow.com/questions/28520171/is-user-identity-getuserid-cached-or-does-it-fetch-from-the-database-every-time

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!