【发布时间】:2012-07-05 10:37:15
【问题描述】:
我有一个 WCF 服务,它托管在 ASP.NET MVC 应用程序中(如http://msdn.microsoft.com/en-us/library/aa702682.aspx 中所述)。部分 MVC 操作和 WCF 服务操作受到保护,我对两者都使用 ASP.NET 表单身份验证:
// protected MVC action
[Authorize]
public ActionResult ProtectedMvcAction(string args)
// protected WCF operation
[PrincipalPermission(SecurityAction.Demand, Role = "User")]
public void ProtectedWcfOperation(string args)
我的 WCF 客户端确保表单身份验证 .ASPXAUTH cookie 在每次 WCF 调用时传输到服务器。
这在很长一段时间内都非常有效。现在我正在使用SSL 证书向我的服务器添加HTTPS 加密。这需要我对 Web.config` 进行以下更改:
<basicHttpBinding>
<binding name="ApiServiceBinding">
<security mode="Transport">
<transport clientCredentialType="None" />
</security>
</binding>
</basicHttpBinding>
服务被激活,客户端可以调用服务器操作。但是,受保护的服务器操作前面的[PrincipalPermission] 属性会突然阻止所有服务调用。我发现了以下内容:
- 在 HTTP 情况下(没有
<security mode="Transport">),Thread.CurrentPrincipal和HttpContext.Current.User都设置为RolePrincipal实例,FormsIdentity实例在RolePrincipal.Identity属性中。在这种情况下,一切正常。 - 在 HTTPS 情况下(在 web.config 中使用
<security mode="Transport">),属性HttpContext.Current.User仍设置为RolePrincipal/FormsIdentity组合。但是,Thread.CurrentPrincipal属性突然被设置为WindowsPrincipal/WindowsIdentity实例,这使得[PrincipalPermission]属性抛出异常。
我尝试了以下方法:
- 将
AppDomain.CurrentDomain.SetPrincipalPolicy更改为所有可能的值(在Global.asax的Application_Start中),但这并没有改变任何东西。 - 在
Application_PostAuthenticate中设置属性Thread.CurrentPrincipal,但在Application_PostAuthenticate和实际服务调用之间,Thread的CurrentPrincipal再次更改为WindowsPrincipal。
有什么提示吗?我做错了什么?
【问题讨论】:
标签: asp.net https forms-authentication iprincipal