Iis 在WCF 4.0 RESTful服务中,如何使用基本身份验证向服务方法传递比用户名/密码更多的数据

Iis 在WCF 4.0 RESTful服务中,如何使用基本身份验证向服务方法传递比用户名/密码更多的数据,iis,c#-4.0,basic-authentication,wcf-4,Iis,C# 4.0,Basic Authentication,Wcf 4,要求: WCF 4.0 IIS主机 自定义源的基本身份验证 宁静的 如何实现基本身份验证的示例和方法有很多,从使用、通过和等等 我面临的问题是,验证实际上将从身份验证后端获取比是/否答案多得多的信息。我希望以某种方式将此信息传递给被调用的服务方法(即,它将是完整的用户对象,具有许多属性来控制服务行为)。我希望避免第二次调用用户存储来根据用户名检索数据,我可以从安全上下文访问用户名 到目前为止,我发现的最接近的东西是,它使用的是的RequestInterceptor,我可以在其中注入Service

要求:

WCF 4.0 IIS主机 自定义源的基本身份验证 宁静的

如何实现基本身份验证的示例和方法有很多,从使用、通过和等等

我面临的问题是,验证实际上将从身份验证后端获取比是/否答案多得多的信息。我希望以某种方式将此信息传递给被调用的服务方法(即,它将是完整的用户对象,具有许多属性来控制服务行为)。我希望避免第二次调用用户存储来根据用户名检索数据,我可以从安全上下文访问用户名

到目前为止,我发现的最接近的东西是,它使用的是的RequestInterceptor,我可以在其中注入ServiceSecurityContext的子类来携带我的数据,并将ServiceSecurityContext.Current转换回服务方法中

上面的问题是,它是为WCF3.5编写的,我希望避免使用初学者工具包

问题:是否知道在链中什么是最合适的连接位置,以便我可以将数据从验证逻辑传递到服务。或者换一种方式,我可以用我的自定义上下文替换安全上下文来承载负载?或任何其他载体机制

我所追求的是那种行为:

客户端(可能是浏览器)尝试使用服务:GET 服务器响应“需要基本身份验证” 客户端提供基本身份验证头并再次发送请求 服务器根据标头中的user/pass从数据库中取出一个用户对象。 如果找不到用户,请再次请求身份验证 如果找到了用户,用户对象将以某种方式传递给服务方法 所有这些都应该在不进行第二次数据库往返的情况下发生

到目前为止,我所理解的是,UserNamePasswordValidator不会这样做——如果我在那里检索到User对象,就无法传递它

我可以创建一个自定义IAuthorizationPolicy或SecurityToken(哪一个),并将用户对象放入其中。但是这应该发生在哪里。我可以使用UserNameSecurityTokenAuthenticator吗?它是否将返回正确的HTTP错误代码以请求凭据?如何/在何处修改web.config以使用自定义内容?到目前为止,我看到了如何设置为仅使用自定义UserNamePasswordAuthenticator


编辑:请检查我的方法。尽管如此,问题还是很好,我得到的答案很有价值。

您可以创建IAuthorizationPolicy的实现,并用身份验证期间获得的主标识替换主标识。请看一下这些链接,它们显示了如何避免两次访问数据库:


我们实现了自己的身份验证HTTP模块。模块钩住HttpApplication的“请求时验证”事件,并针对后端运行验证。后端可以自由返回它想要的任何东西(在我们的例子中,它返回的不仅仅是yes/no。返回的对象实现System.Security.Principal.IIdentity接口。身份验证成功后,我们将身份(由auth返回的对象)附加到HttpContext.User中携带的主体

沿着管道,您可以随时访问当前上下文的用户,并获取您的所有身份信息


这种方法唯一的显著缺点是它需要ASP.net兼容性,但是如果您已经在运行这样的Rest服务,那么这应该不会是一个问题。

我最终根本没有使用WCF。创建和测试RESTFull API要容易得多,并且使用(将在0.8版本中)我所问的很简单。

我已经阅读了,并且一直在阅读和重读所有这些文章,但似乎最后每个人都会感到困惑,并且通常会选择其他方式。我将编辑我的问题,并提供更多细节,但我仍然没有解决我的问题的方法。谢谢。我正在研究类似的方法-我正在研究的模块是:。同一个人展示了如何连接这一行:。你是否经历过类似的事情,或者你找到了从上下文中获取身份的快捷方式?它与链接中显示的方式有点不同。我们希望1)使身份验证块单元可测试,因此我们必须删除对HttpContext.Current的所有依赖项。2) 允许由业务逻辑中的HttpContext.Current以外的其他方提供标识,因为可以从web服务以外的位置调用相同的BL。为此,我们创建了IdentityFactories,当流程在WS下运行时,我们将注入一个工厂来查看HttpContext。这有意义吗?我可以在以后编辑更详细的答案。现在我很忙,希望这能帮上忙。这很有意义。我的问题是,如果你在这些确切的地方截获了,就像他们所展示的那样,或者你找到了一种更合适的方式。否则,你对工厂的看法是对的。模块在AuthenticateRequest(类似于CodeProject链接)截取并传递给我们定制的验证器。所以在这个意义上,它是相似的。我们的方法对我们很有效。如果你有不同的想法,我想听听你是怎么做到的。祝你好运