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

可以Profile包含在UserNameSystem.Web.Profile.ProfileBase

旁边的<=>命名空间中
有帮助吗?

解决方案 3

我决定自己编写用户用户身份验证(非常简单但有效),我应该在很久以前完成这项工作。

我最初的问题是关于UserId的问题,但不能从以下网址获得:

System.Web.HttpContext.Current.User.Identity.Name

其他提示

试试这个:

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大小限制而要非常小心):表单身份验证:没有提供者,没有会话的成员身份,角色和个人资料

尝试以下方法:

Membership.GetUser().ProviderUserKey
public string GetUserID()
            {
                MembershipUser _User;
                string _UserId = "";
                _User = Membership.GetUser();
                Guid UserId = (Guid)_User.ProviderUserKey;
                return _UserId = UserId.ToString();
            }

这里有两个选项:

1)使用username作为用户数据表的主键 即:

select * from [dbo.User] where Username = 'andrew.myhre'

2)将UserID添加到个人资料中。

每种方法都有利弊。我个人更喜欢第一个,因为这意味着我不一定需要设置开箱即用的配置文件提供程序,而且我更喜欢在我的系统中强制使用唯一的用户名。

Andrew:我会小心做一个像你默认显示的那样的查询,没有与之匹配的索引,因此你冒着全表扫描的风险。此外,如果您将用户数据库用于多个应用程序,则未包含应用程序ID。

最接近的索引是aspnet_Users_Index,它需要ApplicationId和LoweredUserName。

编辑:

哎呀 - 重读Andrew的帖子,他没有在aspnet_Users表上做select *,而是使用用户名作为主键的自定义配置文件/用户表。

我遇到了这个问题,解决方案是在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>
{
MembershipUser m = Membership.GetUser();
Response.Write("ID: " + m.ProviderUserKey.ToString());
}

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

您是否尝试过使用System.Web.HttpContext.Current.User.Identity.Name? (确保首先验证UserIdentity是否为非空。)

scroll top