我正在构建一个MVC3 Intranet应用程序,它使用连接到Server的默认MembershipProvider、ProfileProvider和RoleProvider。如果使用窗体身份验证,角色提供程序将正确填充。当我切换到Windows身份验证时,角色提供程序不再填充。这是通过在代码中放置一个断点并查看"Roles.GetRolesForUser()“来测试的。我怀疑传递给数据库的userid是'DOMAIN\ userid‘(这是User.Identity.Name中的内容),而数据库中的仅仅是userid。
因为一切都是默认的,所以没有太多的代码可供发布。
<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是唯一的。
什么是纠正这一问题的最佳途径,而不必将整个数据库更改为具有域\userid而不仅仅是userid?这可以不需要编写自定义成员资格/配置文件/角色提供程序来完成吗?
发布于 2012-10-09 23:21:36
如果您只想使用Windows,那么您不希望使用SqlRoleProvider,而是希望使用WindowsTokenRoleProvider,这将返回它们的AD角色。(没有理由使用成员资格提供程序,因为在使用Windows身份验证时,未经身份验证就无法访问站点)
如果您想使用Windows身份验证,但使用SqlRoles,那么您可能希望这样做:
Based-Security-with-ASP.NET-2.0-using-Windows-Authentication-and-SQL-Server.aspx
https://stackoverflow.com/questions/12459994
复制相似问题