Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 将HttpContext.Current.User.Identity传递给WCF_Asp.net Mvc_Wcf_Authentication_Cookies_Httpcontext - Fatal编程技术网

Asp.net mvc 将HttpContext.Current.User.Identity传递给WCF

Asp.net mvc 将HttpContext.Current.User.Identity传递给WCF,asp.net-mvc,wcf,authentication,cookies,httpcontext,Asp.net Mvc,Wcf,Authentication,Cookies,Httpcontext,寻求一些建议(或者甚至是直接的回答) 我有一个MVC3网站。我还运行了一组WCF服务(现在所有的东西都在同一个盒子上) 我试图做的是对客户端进行身份验证(该部分工作正常),然后将经过身份验证的用户传递给各种WCF调用 目前,我已经在Global.Asax中连接了应用程序\u AuthenticateRequest()方法,它归结为创建一个新的GenericEntity&GenericPrincipal,然后将该主体分配给HttpContext.Current.User: ... GenericI

寻求一些建议(或者甚至是直接的回答)

我有一个MVC3网站。我还运行了一组WCF服务(现在所有的东西都在同一个盒子上)

我试图做的是对客户端进行身份验证(该部分工作正常),然后将经过身份验证的用户传递给各种WCF调用

目前,我已经在
Global.Asax
中连接了
应用程序\u AuthenticateRequest()
方法,它归结为创建一个新的
GenericEntity&GenericPrincipal
,然后将该主体分配给
HttpContext.Current.User

...
GenericIdentity identity = new GenericIdentity(userName);
GenericPrincipal principal = new GenericPrincipal(identity, null);
HttpContext.Current.User = principal;
...
这一部分似乎也很好

但是当我点击我的服务时,我完全失去了我设置的用户。值为空或为假

我注意到的一个主要问题是,在客户端,
HttpContext.Current.User.Identity
对象的类型是
{System.Web.Security.FormsIdentity}
,但在服务中它的类型是
{System.Security.Principal.WindowsIdentity}

根据我读到的一些内容,这听起来像是简单地修改我的
web.config
,使其包含
aspNetCompatibilityEnabled=“true”
就足以使其正常工作。但这不是我看到的。所以,要么我没有理解所有的事情(一个很好的可能性),要么我把事情搞砸了(另一个很好的可能性)

所以我的问题是。这可能吗?如果可能的话,想想我错过了什么?我注意到其他一些人发布了类似的内容,但从未收到过明确的答复(参见和)


非常感谢您的任何建议。

我不能直接回答您的问题,但希望能帮助您找到明确的答案

您有两个服务层,似乎您的需求是在所有层之间共享身份验证标识

因此,原则上,您需要(至少)相同的身份验证机制或算法或技术来实现这一点。但是在这一点上,您使用的不是相同的(当您看到一个
FormSideEntity
和一个
WindowsIdentity
时,您注意到了)

事实:

  • 您将需要相同的身份验证机制
  • 无论您使用何种机制,都需要支持您想要进行的第三跳(这意味着您可以在第三个服务中使用用户的身份,而无需实际拥有重新验证的凭据)
问题:

  • 如果继续使用表单身份验证,则需要使用WCF服务重新身份验证(当然,还需要提供身份凭据,这可能会有所帮助)。我发现这很难做到,除非你保留用户用来认证他/她自己的密码,这通常是个坏主意
  • 如果继续对站点使用Windows身份验证,则如果用户从Intranet登录,则会出现问题。Kerberos(Active Directory使用Kerberos)的有趣之处在于,它允许用户访问远程资源,而无需重新验证。。。但此用户标识令牌仅适用于1跳。虽然您的WCF和MVC服务在同一台服务器上,但如果您最终取消WCF服务,它将正常工作。。。这是第三个框边界。。。如果是第三跳,Kerberos票证就不够好了
所以。。。由于不知道您的要求,我首先建议您:

  • 忘记WCF层上的身份验证
  • 让您的WCF服务访问私有化(发挥您的网络技能…防火墙等)。我首先让WCF在一个单独的IIS网站上运行,该网站不监听端口80(或443),并确保防火墙阻止从LAN之外的IP访问您的新WCF端口(或者更好,在您的白名单之外(目前为localhost))
  • 将用户标识指定为每个WCF调用的参数。或者,如果您觉得很疯狂,可以探索通过SOAP头指定用户身份的方法(如果您的WCF使用SOAP)。自定义标题也可以。在授予用户访问WCF服务的权限之前,您将信任您的网站能够正确地质询和验证用户

我已经看过很多次了。在私有服务上不进行身份验证是一个很好的性能交易,但您需要采取预防措施,因为一般来说,大多数IT攻击都来自内部LAN。

当您在当前用户上下文上专门设置
GenericEntity
时,您会说看到
FormSidenty
,这很奇怪。你搞混了吗?