如何在不使用ASP.NET Web 应用程序项目的情况下访问UserId
ASP.NET Membership ?Membership.GetUser(username)
可以UserId
包含在( )Profile
旁边的命名空间中吗?UserName
System.Web.Profile.ProfileBase
如何在不使用ASP.NET Web 应用程序项目的情况下访问UserId
ASP.NET Membership ?Membership.GetUser(username)
可以UserId
包含在( )Profile
旁边的命名空间中吗?UserName
System.Web.Profile.ProfileBase
试试这个:
MembershipUser CurrentUser = Membership.GetUser(User.Identity.Name);
Response.Write("CurrentUser ID :: " + CurrentUser.ProviderUserKey);
您是否每次需要 UserId 时都保存数据库调用?如果是这样,当我使用 ASP.NET MembershipProvider 时,我通常要么做一个允许我缓存该调用的自定义提供程序,要么做一个我可以缓存的实用程序方法。
如果您正在考虑将其放入配置文件中,我认为这样做没有太多理由,特别是因为它仍然需要数据库调用,除非您在那里使用自定义配置文件提供程序,否则它具有额外的处理解析出 UserId。
如果您想知道为什么他们没有实现 GetUserId 方法,那仅仅是因为您并不总是保证该用户 ID 将是包含的提供程序中的 GUID。
编辑:
请参阅ScottGu 关于提供程序的文章,该文章提供了下载实际源代码的链接,即 SqlMembershipProvider。
但最简单的做法是用户对象或实用程序类中的 GetUserId() 方法,如果存在,则从缓存/会话中获取 UserId,否则访问数据库,通过用户名缓存(或存储在会话中),并返回它。
更多需要考虑的事情(但由于 cookie 大小限制要非常小心):Forms Auth: Membership, Roles and Profile with no Providers and no Session
我决定自己编写用户用户身份验证(非常简单但有效),我早就应该这样做了。
我最初的问题是关于 UserId 的,但无法从以下位置获得:
System.Web.HttpContext.Current.User.Identity.Name
尝试以下操作:
Membership.GetUser().ProviderUserKey
public string GetUserID()
{
MembershipUser _User;
string _UserId = "";
_User = Membership.GetUser();
Guid UserId = (Guid)_User.ProviderUserKey;
return _UserId = UserId.ToString();
}
您在这里有两个选择:
1) 使用用户名作为用户数据表的主键,即:
select * from [dbo.User] where Username = 'andrew.myhre'
2) 将 UserID 添加到配置文件中。
每种方法都有优点和缺点。我个人更喜欢第一个,因为这意味着我不一定需要设置开箱即用的配置文件提供程序,而且我更喜欢在我的系统中强制执行唯一的用户名。
安德鲁:我会小心地做一个像你默认显示的查询,没有与之匹配的索引,所以你冒着全表扫描的风险。此外,如果您将用户数据库用于多个应用程序,则您没有包含应用程序 ID。
最接近的索引是 aspnet_Users_Index,它需要 ApplicationId 和 LoweredUserName。
编辑:
糟糕 - 重读 Andrew 的帖子,他没有在 aspnet_Users 表上选择 *,而是使用用户名作为主键的自定义配置文件/用户表。
你试过使用System.Web.HttpContext.Current.User.Identity.Name
吗?(确保首先验证它User
并且Identity
是非空的。)
{
MembershipUser m = Membership.GetUser();
Response.Write("ID: " + m.ProviderUserKey.ToString());
}
将从 aspnet_Membership 表中为您提供当前用户的 UserID(唯一标识符) - 前提是当前用户已成功登录。如果您尝试 <%= %> 或在成功验证之前分配该值,您将收到错误“对象引用未设置为对象的实例”。
我遇到了这个问题,解决方案是在 web.config 配置中,尝试使用这些配置 web.config:
<roleManager
enabled="true"
cacheRolesInCookie="true"
defaultProvider="QuickStartRoleManagerSqlProvider"
cookieName=".ASPXROLES"
cookiePath="/"
cookieTimeout="30"
cookieRequireSSL="false"
cookieSlidingExpiration="true"
createPersistentCookie="false"
cookieProtection="All">
<providers>
<add name="QuickStartRoleManagerSqlProvider"
type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName="ASPNETDB"
applicationName="SecurityQuickStart"/>
</providers>
</roleManager>