【问题标题】:Problems with IIS and Custom Membership Provider + Custom Role ProviderIIS 和自定义成员资格提供程序 + 自定义角色提供程序的问题
【发布时间】:2013-08-05 15:01:47
【问题描述】:

我为自定义成员和角色提供者开发了自己的类。

一切都在本地工作。尽管如此,在将解决方案部署到 IIS 进行测试后,我的登录操作似乎有效(至少,该操作验证了用户名+密码并且用户似乎已通过身份验证)但是每当我尝试访问带有注释的操作时,例如

  [Authorize(Roles="Employee, Admin")]

我不断被重定向到登录页面,好像用户没有必要的角色(但他有)。

因此,在本地,应用程序在执行操作之前成功地验证了用户并检查了经过身份验证的用户的角色(因此,我假设我在两个类上的方法都是正确的)但在 IIS 上,角色提供程序似乎无法正常工作。任何人碰巧知道我可能错在哪里,或者我怎样才能更好地了解我的问题?

在我的 Web.Config 中:

<system.web>
(...)
<authentication mode="Forms">
  <forms loginUrl="~/Account/Login" timeout="2880" />
</authentication>
<membership defaultProvider="CustomMembershipProvider">
  <providers>
    <clear />
    <add name="CustomMembershipProvider" type="MyApplication.Infrastructure.CustomMembershipProvider" connectionStringName="DBEntities" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" />
  </providers>
</membership>
<roleManager enabled="true" defaultProvider="CustomRoleProvider">
  <providers>
    <clear />
    <add name="CustomRoleProvider" type="MyApplication.Infrastructure.CustomRoleProvider" connectionStringName="DBEntities" applicationName="/" />
  </providers>
</roleManager>
(...)
</system.web>

提前致谢。

编辑:附加信息。

  • 我刚刚将我的一个操作注释修改为简单的 [Authorize] 并且它可以工作。因此,我认为身份验证有效,问题一定与角色提供者有关。

  • 我正在为我的数据模型使用实体框架,即 con。字符串如下:

  • 我设法注册了一个用户并使用新创建的帐户登录,这意味着数据库连接和自定义成员资格提供程序(?)工作正常。

  • A "@foreach (String str in Roles.GetRolesForUser(User.Identity.Name)){@str} 在本地打印角色,部署时不打印任何内容。

【问题讨论】:

  • 连接字符串如何?
  • 您确定角色存在并且用户已被分配到他们的角色?
  • 是的,只是仔细检查了一遍。我用于本地测试的数据库实例与我在部署到 IIS 时使用的数据库实例相同。因此,如果角色存在并且在本地被识别,则问题不应该存在。
  • 角色提供者显然有问题,因为当您尝试将它们全部打印出来时,它什么也没打印,请验证您的自定义提供者的 GetAllRoles 代码
  • 是的,塞尔吉奥,我刚刚这样做并发现了问题。谢谢。

标签: asp.net-mvc iis asp.net-mvc-4 custom-membershipprovider


【解决方案1】:

好的,我修好了。以下是将来有人需要时的解释:

在缩小原因(如我的编辑中所见)之后,我发现问题一定与我的 CustomRoleProvider 有关。

那个类有这样的方法:

  public override string[] GetRolesForUser(string Username)
  {
        List<string> roles = new List<string>();

        using (DBEntities _db = new DBEntities())
        {
            try
            {
                var dbRoles = from r in _db.UserRole
                              where r.Users.Username == Username
                              select r;

                foreach (var role in dbRoles)
                {
                    roles.Add(role.Role.Name);
                }
            }
            catch 
            {
            }
        }

        return roles.ToArray();
  }

所以我捕捉到了一个异常并且没有对它做任何事情。我删除了 try-catch 块,并收到此消息:

  There is already an open DataReader associated with this Command which must be closed first.

有点堆栈溢出,我发现了这个:There is already an open DataReader associated with this Command which must be closed first

原来我的本地连接字符串有MultipleActiveResultSets=true,但我的发布设置上的连接字符串没有。我修改了我的发布设置,瞧,现在似乎可以工作了。

我真的不知道拥有该设置的优点/缺点,但它正在发挥作用,我真的需要继续前进。无论如何,谢谢大家的帮助。

【讨论】:

  • 如果您发布自己的答案,您应该接受它作为答案。
  • 嘿,克里斯,可以,但我要等 2 天左右 :)
【解决方案2】:

我也遇到过类似的问题。将 machineKey 添加到 web.config 后一切正常。

<system.web>
<machineKey validationKey="2E417D4AC04F20FA6CE1CF1EFE23FBF1695BF6981B605B1B8628D2182C43D0B10E48C4A83FDCE0D1D6300095D9EE1B8746A37E2C3256554405983DCAA7622875" decryptionKey="FA6D35C22BF7E5E9E4438052B924CCC017521137C5EB017D07C7038B80C5F726" validation="SHA1" decryption="AES" />
  </system.web>

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多