2013-08-05 224 views
2

我为自定义成员资格和角色提供程序开发了我自己的类。IIS和自定义成员资格提供程序+自定义角色提供程序的问题

一切工作在本地。尽管如此,在将解决方案部署到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> 

在此先感谢。

编辑:Aditional信息。

  • 我只是修改我的行动anotation的一个简单[授权]和它的作品。所以,我认为身份验证的作用和问题必须与角色提供者相关联。

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

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

  • A“@foreach(在Roles.GetRolesForUser(User.Identity.Name)字符串str)本地打印任务和部署时,不会显示任何信息。

+0

Hows连接字符串? – Fals

+1

您确定角色存在并且用户已分配到其角色? –

+0

是的,只是双重检查。我用于本地测试的数据库实例与我在部署到IIS时使用的数据库实例相同。因此,如果角色存在并在当地得到认可,问题就不应该存在。 – user1987392

回答

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的一点,我发现这一点:There is already an open DataReader associated with this Command which must be closed first

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

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

+0

如果你发布自己的答案,你应该接受它作为答案。 –

+0

嘿克里斯,会做但我必须等待2天左右:) – user1987392

0

我有有类似问题的machineKey添加到Web.config文件后一切正常,没事

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

嗨。我刚刚尝试过(在此链接的帮助下:http://www.codeproject.com/Articles/221889/How-to-Generate-Machine-Key-in-IIS7),但遗憾的是它没有奏效。 – user1987392

相关问题