我正在使用连接到SQL Server dB的默认MembershipProvider,ProfileProvider和RoleProvider构建MVC3 Intranet 应用程序。如果我使用Forms身份验证,角色提供程序将正确填充。当我切换到Windows身份验证时,角色提供程序不再填充。这是通过在代码中放置一个断点并查看“Roles.GetRolesForUser()”来测试的。我怀疑发生的是传递给数据库的用户ID是'DOMAIN \ USERID'(这是User.Identity.Name中的内容),而数据库中的用户ID只是用户ID。
由于一切都是默认的,因此没有太多要发布的代码。
<authentication mode="Windows" />
<authorization>
<deny users="?"/>
</authorization>
<membership defaultProvider="AspNetSqlMembershipProvider">
<providers>
<clear />
<add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" />
</providers>
</membership>
<profile>
<providers>
<clear />
<add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/" />
</providers>
<properties></properties>
</profile>
<roleManager enabled="true" defaultProvider="AspNetSqlRoleProvider" cacheRolesInCookie="true">
<providers>
<clear />
<add connectionStringName="ApplicationServices" applicationName="/" name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" />
<add applicationName="/" name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" />
</providers>
</roleManager>
我首先想到的是,我们可以在将身份传递给成员资格提供者之前删除域名,但User.Identity.Name只是获取。
更正此问题的最佳途径是什么,而不必将整个数据库更改为拥有domain \ userid而不仅仅是userid?这可以在不必编写自定义成员资格/配置文件/角色提供程序的情况下完成吗?
答案 0 :(得分:1)
如果您只想使用Windows身份验证,那么您不希望使用SqlRoleProvider,而是希望使用WindowsTokenRoleProvider,它将返回其AD角色。 (没有理由使用成员资格提供程序,因为在使用Windows身份验证时,如果没有经过身份验证,则无法访问该网站)
如果你想使用Windows身份验证,但是使用SqlRoles,那么你可能想要这样做: