用于下游WCF身份验证和授权的ASP.NET Forms Auth

时间:2013-05-14 20:14:59

标签: asp.net wcf forms-authentication wcf-security

开发环境:Windows 7企业版 .NET 4.0 with Visual Studio 2010

生产环境:带有IIS 7.0的Windows 2008 Server

我正在尝试找出在与ASP .NET Web应用程序分开的安全区域中的单独计算机上运行的WCF服务进行身份验证和授权的最佳方法。

用户使用用户名和密码登录我们存储在数据库中的凭据。我们没有实现成员资格提供程序,但是当用户的凭据通过芥末时,我们手动创建一个具有用户ID的Forms Auth票证。

我确实推出了自己的角色提供程序,它实现了RoleProvider。因此,我们拥有“标准”ASP .NET角色以及在我们的ASP .NET Web应用程序上运行的表单身份验证票证。

我需要做的是以某种方式将这些凭据传递给位于另一台机器上的WCF服务。最初,我以为我可能会使用Windows Identity Foundation并创建自定义安全令牌服务(STS)。基本上,如果用户进行身份验证,则创建令牌并将基于声明的授权与用户身份一起添加到令牌中,并将其传递给WCF服务。

我们当前使用的.NET Remoting服务(.NET 1.1时间帧)根本不进行身份验证或授权。

这似乎有点过分,因为可能有一种方法可以简单地传递我当前与用户的信息,就像您创建Forms Auth票证时一样,我知道当前的IPrinciple是使用IIdentity设置的设置为“name”属性设置为Thread.CurrentIdentity上的用户ID。

我很确定IsInRole(“WhateverRole”)在这一点上也能正常工作,但所有这些都在Web应用程序方面。没有任何东西传递给.NET Remoting服务。

看看这两个类:
AuthenticationService Class
ServiceAuthorization Class
我不认为他们是我想要的。同样,我读过米歇尔·布斯塔曼特的Learning WCF,但我并没有真正看到这个特殊情况。当我阅读 Windows身份验证时,我一直认为需要将其与内部Windows安全状况相关联的内部NTLM或Kerberos联系起来。我们的用户均不是内部用户。他们严格对外。

现在,我知道如果用户获得Forms Auth票证,他们基本上会获得有效的IPrinciple并且应该设置角色,对吧?

如果是这样,有没有办法将其传递到另一台机器上的WCF服务设置?如果我将WCF clientCredentialType设置为windows并将serviceAuthorization principlePermissionMode设置为“UseAspNetRoles”,那么当我进行服务调用时,它们是否会在安全上下文中从Web应用程序传递到WCF服务?

我无法找到可能发生的事情。感谢。

1 个答案:

答案 0 :(得分:1)

我认为你想要的是:

http://thoughtorientedarchitecture.blogspot.com/2009/10/flowing-aspnet-forms-authentication.html

这不是超级安全,因为你有效地制造了自己的中间人攻击,但它可能足以满足大多数需求。

基本上归结为:

  1. 使用相同的MachineKey配置两台服务器
  2. 从用户请求中获取FormsAuthentication Cookie
  3. 将Cookie附加到传出的WCF服务调用
  4. ???
  5. 利润