使用IIS7,WCF Rest,自定义身份验证模块进行模拟

时间:2011-11-04 15:04:37

标签: wcf iis rest impersonation custom-authentication

所以我正在设置一个托管在iis7中的WCF服务。该服务是一项REST服务。

到目前为止,我们对身份验证的要求是只有域帐户才能连接到该服务。我们使用基本身份验证并使用模拟通过业务层调用我们的数据库。

这一切都运作良好。

现在我们需要允许非域帐户使用我们的服务。由于IIS的某些原因我实现了这个(http://custombasicauth.codeplex.com/)和一个自定义成员资格提供程序(根据传入的用户名)尝试对Active Directory进行身份验证,或者对asp.net成员资格进行身份验证供应商。这部分工作正常。

我现在的问题是模仿不起作用(这是可以理解的。)现在,这是我迷失的地方,需要帮助指导或清除所有迷雾。我想做什么(我不知道这是否可能)是这样的:

如果用户是域用户,则即可模拟其帐户。 如果不是域用户,则模拟“通用用户域帐户”。 作为奖励,我希望这种情况发生在“幕后”,这样我们所拥有的每个方法都不需要添加特殊逻辑来处理这个问题。

我已经阅读了很多关于身份,政策提供者,角色提供者的内容......现在我对此感到非常困惑。

任何人都对此有所了解?

1 个答案:

答案 0 :(得分:-1)

因此,经过大量在线查看有关使用IIS进行模拟的更多信息后,我找不到太多有用的信息。所以我开始更多地将其视为“黑客攻击”。

我正在使用它(http://custombasicauth.codeplex.com/)来允许我们使用WCF进行自定义基本身份验证。

该模块如何流动 LeastPrivilege.CustomBasicAuthentication.CustomBasicAuthenticationModule.OnEnter()
在建立连接时调用。这反过来调用 LeastPrivilege.CustomBasicAuthentication.CustomBasicAuthenticationModule.AuthenticateUser(),最终调用 LeastPrivilege.CustomBasicAuthentication.CustomBasicAuthenticationModule.SetPrincipal(string username)

我更改了SetPrincipal以接受密码 private static void SetPrincipal(string username,string password)

在这里,我在用户名(检查我们的域名前缀)上做了一个简单的if,以确定用户是否是域帐号。如果它是域帐户,我使用他们的用户名/密码来创建 WindowsIdentity (我使用http://www.codeproject.com/KB/dotnet/UserImpersonationInNET.aspx进行了一些重构,只获得 WindowsIdentity )。如果用户不是域帐户,我使用已知的硬编码域帐户。 然后,我接受 WindowsIdentity 并创建 WindowsPrincipal ,然后将其设置为 HttpContext.Current.User

所以这对我们有用。假冒正在发挥作用。作为一个副作用,我们不需要使用 [OperationBehavior(Impersonation = ImpersonationOption.Required)] 属性来装饰我们的WCF方法。我不知道这是否是“正确”的做法,但我认为它非常接近。我认为IIS检测到当前用户中存在WindowsPrincipal并自动模拟该帐户。

相关问题