如何在不使用ASP.NET Web应用程序项目中的UserId
的情况下访问ASP.NET成员资格中的Membership.GetUser(username)
?
UserId
(Profile
)旁边的UserName
名称空间中可以System.Web.Profile.ProfileBase
包含哪些内容?
答案 0 :(得分:23)
试试这个:
MembershipUser CurrentUser = Membership.GetUser(User.Identity.Name);
Response.Write("CurrentUser ID :: " + CurrentUser.ProviderUserKey);
答案 1 :(得分:13)
您是否有理由在每次需要UserId时保存数据库调用?如果是这样,当我使用ASP.NET MembershipProvider时,我通常会做一个允许我缓存该调用的自定义提供程序,或者我可以缓存的实用程序方法。
如果您正考虑将其放入配置文件中,我认为没有太多理由这样做,特别是因为它仍然需要数据库调用,除非您在那里使用自定义配置文件提供程序,否则它具有添加了解析UserId的处理。
如果您想知道为什么他们没有实现GetUserId方法,那只是因为您并不总是保证该用户ID将是包含的提供者中的GUID。
编辑:
请参阅提供ScottGu's article on providers的link to downloading the actual source code for i.e. SqlMembershipProvider。
但最简单的做法是在用户对象或实用程序类中使用GetUserId()方法,在那里从缓存/会话中获取UserId(如果有),否则命中数据库,通过用户名缓存它(或存储在会话),并将其返回。
要考虑更多内容(但由于Cookie大小限制而要非常小心):Forms Auth: Membership, Roles and Profile with no Providers and no Session
答案 2 :(得分:4)
我决定自己编写用户用户身份验证(非常简单但有效),我应该在很久以前完成这项工作。
我最初的问题是关于UserId的问题,但不能从以下网址获得:
System.Web.HttpContext.Current.User.Identity.Name
答案 3 :(得分:2)
尝试以下方法:
Membership.GetUser().ProviderUserKey
答案 4 :(得分:1)
public string GetUserID()
{
MembershipUser _User;
string _UserId = "";
_User = Membership.GetUser();
Guid UserId = (Guid)_User.ProviderUserKey;
return _UserId = UserId.ToString();
}
答案 5 :(得分:0)
这里有两个选项:
1)使用username作为用户数据表的主键 即:
select * from [dbo.User] where Username = 'andrew.myhre'
2)将UserID添加到个人资料中。
每种方法都有利弊。我个人更喜欢第一个,因为这意味着我不一定需要设置开箱即用的配置文件提供程序,而且我更喜欢在我的系统中强制使用唯一的用户名。
答案 6 :(得分:0)
Andrew:我会小心做一个像你默认显示的那样的查询,没有与之匹配的索引,因此你冒着全表扫描的风险。此外,如果您将用户数据库用于多个应用程序,则未包含应用程序ID。
最接近的索引是aspnet_Users_Index,它需要ApplicationId和LoweredUserName。
编辑:
哎呀 - 重读Andrew的帖子,他没有在aspnet_Users表上做select *,而是使用用户名作为主键的自定义配置文件/用户表。
答案 7 :(得分:0)
您是否尝试过使用System.Web.HttpContext.Current.User.Identity.Name
? (确保首先验证User
和Identity
是否为非空。)
答案 8 :(得分:0)
{
MembershipUser m = Membership.GetUser();
Response.Write("ID: " + m.ProviderUserKey.ToString());
}
将从aspnet_Membership表中为当前用户提供UserID(uniqueidentifier) - 提供当前已成功登录的内容。如果您尝试<%=%>或者在成功验证之前分配该值,您将收到错误“对象引用未设置为对象的实例”。
答案 9 :(得分:0)
我遇到了这个问题,解决方案是在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>