【问题标题】:How can I access UserId in ASP.NET Membership without using Membership.GetUser()?如何在不使用 Membership.GetUser() 的情况下访问 ASP.NET Membership 中的 UserId?
【发布时间】:2010-09-13 21:32:57
【问题描述】:

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

UserId 是否可以包含在 Profile 命名空间中,位于 UserName (System.Web.Profile.ProfileBase) 旁边?

【问题讨论】:

  • 你能详细说明原因吗?
  • 当我每次调用 Membership.GetUser().ProviderUserKey 时都会调用 DB 来检索这个 UserId

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


【解决方案1】:

试试这个:

MembershipUser CurrentUser = Membership.GetUser(User.Identity.Name);
Response.Write("CurrentUser ID :: " + CurrentUser.ProviderUserKey);

【讨论】:

  • 传入用户名肯定有帮助,否则我会得到空返回!谢谢你。
【解决方案2】:

您是否每次需要 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,否则访问数据库,通过用户名缓存它(或存储在session),然后返回。

要考虑更多内容(但由于 cookie 大小限制,请务必小心):Forms Auth: Membership, Roles and Profile with no Providers and no Session

【讨论】:

  • 答案末尾的小文章。
【解决方案3】:

我决定自己编写用户用户身份验证(非常简单但很有效),我早就应该这样做了。

我最初的问题是关于 UserId 的,但无法从以下位置获得:

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

【讨论】:

  • 跟进您的帖子,如果您使用 Microsoft.AspNet.Identity 导入;您将有权访问 User.Identity.GetUserId()
【解决方案4】:

尝试以下方法:

Membership.GetUser().ProviderUserKey

【讨论】:

    【解决方案5】:
    public string GetUserID()
                {
                    MembershipUser _User;
                    string _UserId = "";
                    _User = Membership.GetUser();
                    Guid UserId = (Guid)_User.ProviderUserKey;
                    return _UserId = UserId.ToString();
                }
    

    【讨论】:

      【解决方案6】:

      你有两个选择:

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

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

      2) 将 UserID 添加到配置文件中。

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

      【讨论】:

        【解决方案7】:

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

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

        编辑:

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

        【讨论】:

          【解决方案8】:

          我遇到了这个问题,解决方法是在 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>
          

          【讨论】:

            【解决方案9】:
            {
            MembershipUser m = Membership.GetUser();
            Response.Write("ID: " + m.ProviderUserKey.ToString());
            }
            

            将从 aspnet_Membership 表中为您提供当前用户的 UserID(唯一标识符) - 前提是当前用户已成功登录。如果您尝试 或在成功验证之前分配该值,您将收到错误“你调用的对象是空的”。

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

            【讨论】:

              【解决方案10】:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2020-05-18
                • 1970-01-01
                • 1970-01-01
                • 2016-10-06
                • 1970-01-01
                相关资源
                最近更新 更多