如何在不使用Membership.GetUser()的情况下访问ASP.NET成员身份中的UserId?

时间:2008-09-28 22:25:27

标签: asp.net asp.net-membership membership

如何在不使用ASP.NET Web应用程序项目中的UserId的情况下访问ASP.NET成员资格中的Membership.GetUser(username)

UserIdProfile)旁边的UserName名称空间中可以System.Web.Profile.ProfileBase包含哪些内容?

10 个答案:

答案 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 providerslink 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? (确保首先验证UserIdentity是否为非空。)

答案 8 :(得分:0)

{
MembershipUser m = Membership.GetUser();
Response.Write("ID: " + m.ProviderUserKey.ToString());
}

将从aspnet_Membership表中为当前用户提供UserID(uniqueidentifier) - 提供当前已成功登录的内容。如果您尝试<%=%>或者在成功验证之前分配该值,您将收到错误“对象引用未设置为对象的实例”。

http://www.tek-tips.com/viewthread.cfm?qid=1169200&page=1

答案 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>