IIS和自定义成员提供程序+自定义角色提供程序的问题

时间:2013-08-05 15:01:47

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

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

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

  [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>

提前致谢。

编辑:有条件的信息

  • 我刚刚将我的一个动作'anotation'修改为简单[授权]并且它有效。因此,我认为身份验证有效,问题必须与角色提供程序相关。

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

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

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

2 个答案:

答案 0 :(得分: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,但我的发布设置上的连接字符串没有。我修改了我的发布设置和vo,似乎现在正在工作。

我真的不知道有这个设置的优点/缺点,但它确实有效,我真的需要继续前进。无论如何,谢谢大家的帮助。

答案 1 :(得分:0)

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

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