对于我们的n层应用程序,我们正在寻找一种从表示层到应用层使用标识的方法。我们的应用程序是一个经典的3层应用程序,具有以下层:
- UI-演示层
- 应用程序/WCF层
- 数据库层
应用层不暴露在互联网上,表示层可以通过本地网络连接。我们的问题是,用户登录到表示层,我们希望表示层将用户身份传递给应用层。如何做到这一点?是否可以通过基于声明的身份验证来实现这一点?我们目前正在寻求在STS服务中实现IWSTrust13SyncContract
,但似乎用户浏览器必须可以访问应用层。有人能就如何处理这件事给我一些建议吗。
您可以使用模拟/委派或受信任的子系统模型-请参阅http://msdn.microsoft.com/en-us/library/aa905320.aspx
模拟/委派最适合使用Windows身份验证,但即使这样,也可能需要信任您的演示层服务器进行委派。在此模型中,应用层对最终用户进行身份验证和授权。
使用更常见的可信子系统模型:
- 演示层对最终用户进行身份验证
- 应用层通常希望对演示层进行身份验证,例如,使用Windows身份验证,只接受来自运行演示层的服务帐户的请求,或者其他一些身份验证方法,例如,利用客户端证书,只接受特定IP地址的请求
- 应用层信任演示层来授权最终用户
有许多方法可以处理授权:
-
演示层通过Facade调用应用层。该立面代表应用层进行所有必要的授权。
-
演示层将最终用户的身份传递给应用层。这可以是带内的(用额外的参数污染您的操作契约),也可以是带外的,例如在自定义SOAP标头中。如果使用SOAP标头,则可以使用行为客户端注入标头,并使用服务器端处理标头,从而使其对WCF的应用程序代码透明。
无论是带内还是带外,您都信任演示层对其传递给应用层的身份进行身份验证。因此,对Presentation Tier进行身份验证是很重要的,并根据您的环境来防止中间人攻击,例如使用HTTPS。
您的演示层将使用某种形式的基于声明的身份验证(被动/主动)。一旦颁发了令牌,您应该在通道上使用的ActAs或OnBehalf将身份联合到您的中间(应用程序)层堆栈的n级服务中。如果你需要样品,请告诉我。
创建一个类似于User Identity的类,并在Presentation层中设置值
并将此calss的引用传递给应用层。