4

我正在構建一個MVC3 Intranet應用程序使用默認的MembershipProvider,ProfileProvider和RoleProvider連接到一個SQL Server dB。如果我使用表單身份驗證,角色提供程序正確填充。當我切換到Windows身份驗證時,角色提供程序不再填充。這是通過在代碼中放置斷點並查看「Roles.GetRolesForUser()」來測試的。我懷疑發生的事情是傳遞給數據庫的用戶標識是'DOMAIN \ USERID'(這是User.Identity.Name中的內容),而數據庫中的內容僅僅是用戶標識。MVC3 Intranet Membership

因爲一切都是默認的,所以沒有太多的代碼可以發佈。

<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?這可以在不必編寫自定義會員/簡介/角色提供者的情況下完成嗎?

+1

這是一個類似的問題,有幾個鏈接。 http://stackoverflow.com/questions/2250921/mixing-forms-authentication-with-windows-authentication – Niklas

+0

我appreaciate帖子,他做了什麼是有趣的;然而,我不是試圖做窗體和Windows身份驗證,我只是想利用Windows身份驗證。 –

+0

嘗試將更改的用戶名添加到表中的DOMAIN \ username並查看它是否有效。兩者之間的用戶名不相同(窗體與窗口)。 –

回答

1

如果您只是想使用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