加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 将HttpContext.Current.User.Identity传递给WCF

发布时间:2020-12-16 03:48:03 所属栏目:asp.Net 来源:网络整理
导读:寻找一些建议(或者甚至是直接回答). 我有一个MVC3网站.我还有一组运行的WCF服务(现在一切都在同一个盒子里). 我要做的是验证客户端(该部分工作正常),然后将该经过身份验证的用户传递给各种WCF调用. 目前,我已经在Global.Asax中连接了Application_Authenticat
寻找一些建议(或者甚至是直接回答).

我有一个MVC3网站.我还有一组运行的WCF服务(现在一切都在同一个盒子里).

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

目前,我已经在Global.Asax中连接了Application_AuthenticateRequest()方法,该方法归结为创建一个新的GenericIdentity& 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”可能足以使这个工作正常.但那不是我所看到的.所以要么我不理解一切(非常好的可能性),要么我搞砸了(另一种可能性很大).

所以我的问题.这是否可能,如果是这样的话 – 想想我错过了什么?我注意到其他一些人发布了类似的东西,但从来没有得到明确的答案(见here和here).

任何建议都非常感谢.

解决方法

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

您有2个服务层,似乎您的要求是在所有层之间共享身份验证身份.

因此,原则上,您需要(至少)相同的身份验证机制或算法或技术来实现此目的.但此时你并没有使用相同的(当你看到FormsIdentity和WindowsIdentity时,你注意到了).

事实:

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

问题:

>如果您继续使用Forms身份验证,则需要使用WCF服务重新进行身份验证(当然还提供身份凭据,this可能会有所帮助).除非你保留用户用来验证他/她自己的密码,否则我觉得很难做到这一点,这通常是一个坏主意.
>如果您继续为您的站点使用Windows身份验证,那么如果用户从Intranet登录,您将遇到问题. Kerberos(Active Directory使用Kerberos)的有趣之处在于,它允许用户访问远程资源而无需重新验证…但此用户身份令牌仅适用于1跳.虽然您的WCF和MVC服务位于同一台服务器上,但它可以工作,但是如果您最终将WCF服务取消…那是第3个盒子边界……第3个跃点,而Kerberos票证将不够好.

所以……如果不知道你的要求,我会建议你:

>忘记WCF层上的身份验证
>使您的WCF服务访问私密(使用您的网络技能……防火墙等).我首先让WCF在一个不收听端口80(或443)的单独IIS网站上运行,并确保防火墙阻止从局域网外的IP访问新的WCF端口(甚至更好,在白色之外list(localhost for now)).
>将用户身份指定为每个WCF调用的参数.或者,如果您感觉疯狂,请探索通过SOAP标头指定用户身份的方法(如果您的WCF使用SOAP).自定义标题也应该没问题.在您授予用户访问WCF服务权限之前,您将信任您的网站以正确地挑战和验证用户.

我现在已经看过很多次.没有私有服务的身份验证是一个很好的性能协议,但是你需要采取预防措施,因为一般来说,大多数IT攻击来自内部局域网.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读