User.Identity.GetUserId 是缓存还是每次都从数据库中获取?
Is User.Identity.GetUserId cached or does it fetch from the database every time?
我正在使用 ASP.Net MVC 5 并且我在我的代码中调用了这一行
string userId = User.Identity.GetUserId();
ASP.NET MVC 是在每次调用时从 table 中获取它,还是缓存它?
似乎 id
和 username
在您登录时被缓存了。
我使用了 SQL Server Profiler 并在登录后 运行 User.Identity.GetUserId();
身份系统 no查询 到数据库。
这是登录时的查询:
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'
查看 Microsoft.AspNet.Identity.Core.dll 的反编译源,您可以看到它从当前身份的声明中检索用户 ID。所以它不会从数据库中获取此信息。
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;
}
我正在使用 ASP.Net MVC 5 并且我在我的代码中调用了这一行
string userId = User.Identity.GetUserId();
ASP.NET MVC 是在每次调用时从 table 中获取它,还是缓存它?
似乎 id
和 username
在您登录时被缓存了。
我使用了 SQL Server Profiler 并在登录后 运行 User.Identity.GetUserId();
身份系统 no查询 到数据库。
这是登录时的查询:
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'
查看 Microsoft.AspNet.Identity.Core.dll 的反编译源,您可以看到它从当前身份的声明中检索用户 ID。所以它不会从数据库中获取此信息。
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;
}