使用 IIS7、WCF Rest、自定义身份验证模块进行模拟
Posted
技术标签:
【中文标题】使用 IIS7、WCF Rest、自定义身份验证模块进行模拟【英文标题】:Impersonation with IIS7, WCF Rest, custom authentication module 【发布时间】:2011-11-04 15:04:37 【问题描述】:所以我正在建立一个 WCF 服务,托管在 iis7 中。该服务是 REST 服务。
到目前为止,我们对身份验证的要求是只有域帐户才能连接到服务。我们正在使用基本身份验证并使用模拟通过我们的业务层调用我们的数据库。
这一切都很好。
现在我们需要允许非域帐户使用我们的服务。由于 IIS 的原因,我实现了这个(http://custombasicauth.codeplex.com/)和一个自定义成员资格提供程序,它将(取决于传入的用户名)尝试针对 Active Directory 或针对 asp.net 成员身份进行身份验证提供者。这部分工作正常。
现在我遇到的问题是模拟不起作用(这是可以理解的。)现在,我迷失了方向,需要帮助来指导或清除所有迷雾。我想做的(我不知道这是否可能)是这样的:
如果用户是域用户,则模拟他们的帐户。 如果不是域用户,则模拟“通用用户域帐户”。 作为奖励,我希望这发生在“幕后”,这样我们拥有的每个方法都不需要添加特殊逻辑来处理这个问题。
我已经阅读了很多关于身份、策略提供者、角色提供者的资料......现在我完全糊涂了。
有人对此有所了解吗?
【问题讨论】:
有人吗?我应该发布更多信息吗? 【参考方案1】:因此,在网上大量查找有关 IIS 模拟工作的更多信息后,我找不到太多有用的信息。所以我开始更多地研究如何“破解”它。
我使用这个 (http://custombasicauth.codeplex.com/) 允许我们使用 WCF 进行自定义基本身份验证。
这个模块的流程是LeastPrivilege.CustomBasicAuthentication.CustomBasicAuthenticationModule.OnEnter() 建立连接时调用。这反过来调用 LeastPrivilege.CustomBasicAuthentication.CustomBasicAuthenticationModule.AuthenticateUser() 最终调用 LeastPrivilege.CustomBasicAuthentication.CustomBasicAuthenticationModule.SetPrincipal(字符串用户名)
我也将 SetPrincipal 更改为接受密码 private static void SetPrincipal(字符串用户名,字符串密码)
在这里,我在用户名上做了一个简单的 if(检查我们的域前缀)以确定用户是否是域帐户。如果它是一个域帐户,我使用他们的用户名/密码来创建一个 WindowsIdentity(我使用了 http://www.codeproject.com/KB/dotnet/UserImpersonationInNET.aspx 并进行了一些重构以仅获得 WindowsIdentity)。如果用户不是域帐户,我会为他们使用已知的硬编码域帐户。 然后我使用这个 WindowsIdentity 并创建一个 WindowsPrincipal 并将其设置为 HttpContext.Current.User
所以这对我们有用。模拟正在发挥作用。作为一个副作用,我们不需要用 [OperationBehavior(Impersonation = ImpersonationOption.Required)] 属性来装饰我们的 WCF 方法。我不知道这是否是“正确”的做法,但我认为它非常接近。我认为 IIS 检测到当前用户中有一个 WindowsPrincipal 并自动模拟该帐户。
【讨论】:
以上是关于使用 IIS7、WCF Rest、自定义身份验证模块进行模拟的主要内容,如果未能解决你的问题,请参考以下文章
使用 System.ServiceModel.ServiceAuthenticationManager 自定义 WCF 身份验证?
WCF REST:使用我自己的自定义验证器时加密凭据 - UserNamePasswordValidator?
使用 Silverlight 5、IIS 7.5 对 WCF 服务进行 Windows 身份验证
使用自定义 ClientCredentials 进行 WCF 身份验证:要使用的 clientCredentialType 是啥?