我正在使用连接到SQL Server dB的默认MembershipProvider、ProfileProvider和RoleProvider构建MVC3Intranet应用程序。如果使用Forms身份验证,则角色提供程序将正确填充。当我切换到Windows身份验证时,角色提供程序将不再填充。这是通过在代码中放置断点并查看"Roles.GetRolesForUser()"来测试的。我怀疑发生的情况是,传递到数据库的用户ID是"DOMAIN\userid"(这是User.Identity.Name中的内容),而数据库中的只是用户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>
我的第一个想法是,我们可以在身份传递给会员提供商之前删除域,但用户。身份名称仅为get。
在不必将整个数据库更改为域\userid而不仅仅是userid的情况下,纠正这一问题的最佳途径是什么?这是否可以在不编写自定义成员资格/配置文件/角色提供程序的情况下完成?
如果你只想使用Windows身份验证,那么你不想使用SqlRoleProvider,而是想使用WindowsTokenRoleProvider,它将返回他们的AD角色。(没有理由使用会员资格提供商,因为在使用Windows身份验证时,如果没有经过身份验证,您就无法访问网站)
如果你想使用Windows身份验证,但使用SqlRoles,那么你可能想做这样的事情:
http://weblogs.asp.net/scottgu/pages/Recipe_3A00_-Implementing-Role_2D00_Based-Security-with-ASP.NET-2.0-using-Windows-Authentication-and-SQL-Server.aspx