使用 Active Directory 成员身份提供程序进行站点身份验证
Using Active Directory Membership Provider for Site Authentication
我有一个 MVC 站点,我正在将其从表单转换为联合身份验证。我能够连接到 ADFS 服务器并验证身份验证。但是,该站点目前使用 ActiveDirectoryMembershipProvider 来验证用户的角色,因为不同的角色允许不同的访问。
我不知道如何填充 MembershipProvider 以便我可以使用诸如此类的内容:
User.IsInRole(@"MY-ROLE")
还有这个:
[Authorize(Roles = "MY-ROLE")]
我的 web.config 中有这个片段,它适用于表单身份验证,但不适用于我的联合站点:
<membership defaultProvider="ADMembershipProvider">
<providers>
<clear />
<add name="ADMembershipProvider" type="System.Web.Security.ActiveDirectoryMembershipProvider" connectionProtection="Secure" attributeMapUsername="sAMAccountName" connectionStringName="ADConn" connectionUsername="LotusLDAPUser" connectionPassword="LotusLDAPUser" />
</providers>
</membership>
我已经阅读了很多 MSDN 文档,但仍然遇到问题,所以请不要只用 link 来回答文档。我将不胜感激一些示例代码。
更新:
我在我的 web.config 中添加了一个 RoleProvider。角色提供者已在表单应用程序版本中成功使用,所以我相信这些值是正确的我只是错过了将它添加到联合版本的 web.config 中。这是我拥有的:
<roleManager enabled="true" defaultProvider="ActiveDirectoryRoleProvider" cacheRolesInCookie="true" cookieName=".ADLibraryROLES" cookiePath="/" cookieTimeout="1440" cookieRequireSSL="false" cookieSlidingExpiration="true" createPersistentCookie="true" cookieProtection="All">
<providers>
<clear />
<add name="ActiveDirectoryRoleProvider" connectionStringName="ADConn" connectionUsername="LotusLDAPUser" connectionPassword="LotusLDAPUser" attributeMapUsername="sAMAccountName" type="MyNamespace.ActiveDirectoryRoleProvider" />
</providers>
</roleManager>
仍然返回 false
User.IsInRole(@"MY-ROLE")
和
[Authorize(Roles = "MY-ROLE")]
对于我在 "MY-ROLE"
中认识的用户
问题是我没有设置会话令牌 Cookie。在表单身份验证版本中,我有代码:
FormsAuthentication.SetAuthCookie(user.UserName, true);
测试联合版本时我没有设置身份验证 cookie,需要这一行:
FederatedAuthentication.SessionAuthenticationModule.WriteSessionTokenToCookie(token);
其中令牌是从我的 Claim
创建的 SessionSecurityToken
。
我有一个 MVC 站点,我正在将其从表单转换为联合身份验证。我能够连接到 ADFS 服务器并验证身份验证。但是,该站点目前使用 ActiveDirectoryMembershipProvider 来验证用户的角色,因为不同的角色允许不同的访问。
我不知道如何填充 MembershipProvider 以便我可以使用诸如此类的内容:
User.IsInRole(@"MY-ROLE")
还有这个:
[Authorize(Roles = "MY-ROLE")]
我的 web.config 中有这个片段,它适用于表单身份验证,但不适用于我的联合站点:
<membership defaultProvider="ADMembershipProvider">
<providers>
<clear />
<add name="ADMembershipProvider" type="System.Web.Security.ActiveDirectoryMembershipProvider" connectionProtection="Secure" attributeMapUsername="sAMAccountName" connectionStringName="ADConn" connectionUsername="LotusLDAPUser" connectionPassword="LotusLDAPUser" />
</providers>
</membership>
我已经阅读了很多 MSDN 文档,但仍然遇到问题,所以请不要只用 link 来回答文档。我将不胜感激一些示例代码。
更新: 我在我的 web.config 中添加了一个 RoleProvider。角色提供者已在表单应用程序版本中成功使用,所以我相信这些值是正确的我只是错过了将它添加到联合版本的 web.config 中。这是我拥有的:
<roleManager enabled="true" defaultProvider="ActiveDirectoryRoleProvider" cacheRolesInCookie="true" cookieName=".ADLibraryROLES" cookiePath="/" cookieTimeout="1440" cookieRequireSSL="false" cookieSlidingExpiration="true" createPersistentCookie="true" cookieProtection="All">
<providers>
<clear />
<add name="ActiveDirectoryRoleProvider" connectionStringName="ADConn" connectionUsername="LotusLDAPUser" connectionPassword="LotusLDAPUser" attributeMapUsername="sAMAccountName" type="MyNamespace.ActiveDirectoryRoleProvider" />
</providers>
</roleManager>
仍然返回 false
User.IsInRole(@"MY-ROLE")
和
[Authorize(Roles = "MY-ROLE")]
对于我在 "MY-ROLE"
中认识的用户问题是我没有设置会话令牌 Cookie。在表单身份验证版本中,我有代码:
FormsAuthentication.SetAuthCookie(user.UserName, true);
测试联合版本时我没有设置身份验证 cookie,需要这一行:
FederatedAuthentication.SessionAuthenticationModule.WriteSessionTokenToCookie(token);
其中令牌是从我的 Claim
创建的 SessionSecurityToken
。