0

所以我正在建立一个 WCF 服务,托管在 iis7 中。该服务是 REST 服务。

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

这一切都运作良好。

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

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

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

我已经阅读了一堆关于身份、策略提供者、角色提供者的东西……现在我完全糊涂了。

有人对此有所了解吗?

4

1 回答 1

-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 并自动模拟该帐户。

于 2011-11-16T15:54:42.590 回答