2

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

一切都在本地工作。尽管如此,在将解决方案部署到 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} 在本地打印角色,部署时不打印任何内容。

4

2 回答 2

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.

有点stackoverflowing,我发现了这个:已经有一个打开的DataReader 与此命令关联,必须先关闭

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

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

于 2013-08-05T15:57:19.313 回答
0

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

<system.web>
<machineKey validationKey="2E417D4AC04F20FA6CE1CF1EFE23FBF1695BF6981B605B1B8628D2182C43D0B10E48C4A83FDCE0D1D6300095D9EE1B8746A37E2C3256554405983DCAA7622875" decryptionKey="FA6D35C22BF7E5E9E4438052B924CCC017521137C5EB017D07C7038B80C5F726" validation="SHA1" decryption="AES" />
  </system.web>
于 2013-08-05T15:09:53.467 回答