Является ли User.Identity.GetUserId кэшированным или он извлекает из базы данных каждый раз?

Я использую ASP.Net MVC 5, и я вызываю эту строку по всему моему коду

string userId = User.Identity.GetUserId();

Идет ли ASP.NET MVC и извлекает это из таблицы для каждого вызова или кэшируется?

Ответ 1

Кажется, что id вместе с username кэшируются при входе в систему.

Я использовал SQL Server Profiler и после входа в систему User.Identity.GetUserId(); система идентификации сделала без запросов к базе данных.

Это запрос, сделанный в 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

Посмотрев на декомпилированные источники Microsoft.AspNet.Identity.Core.dll, вы можете увидеть, что он извлекает идентификатор пользователя из заявлений текущего идентификатора. Поэтому он не получает эту информацию из базы данных.

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;
}