如何使用基本身份验证将更多数据,然后将用户名/密码传递给WCF 4.0 RESTful服务中的服务方法

Sun*_*nov 10 iis basic-authentication wcf-4 c#-4.0

要求:

WCF 4.0 IIS主机使用自定义源RESTful进行基本身份验证

通过使用UserNamePasswordValidator,通过ServiceAuthorizationManagerIDispatchMessageInspector等,有很多示例和方法来实现基本身份验证.

我面临的问题是,验证实际上将从身份验证后端获取更多信息,而不是是/否答案.我想以某种方式将这些信息传递给调用的服务方法(即它将是完全成熟的User对象,具有许多属性来控制服务行为).我想避免第二次调用用户存储来检索基于用户名的数据,我可以从安全上下文访问该用户名.

到目前为止,我发现最接近的是这个解决方案,它使用WCF REST入门工具包的RequestInterceptor,我可以在其中注入ServiceSecurityContext的子类来继承我的数据,并在服务方法中强制转换ServiceSecurityContext.Current.

上面的问题是,它是为WCF 3.5编写的,我想避免使用入门套件.

问题是:任何想法最适合链接的地方,所以我可以将数据从验证逻辑传递给服务.或者用另一种方式,我可以用自定义的安全上下文替换安全上下文来进行加载?或任何其他承运人机制?

我追求的是那种行为:

客户端(可能是浏览器)尝试使用该服务:GET https:// myservcer/service/data 服务器响应"需要基本身份验证"客户端提供基本身份验证标头并再次发送请求服务器,基于用户/传入标题,从数据库中提取出一个User对象.如果找不到用户,请再次请求身份验证如果找到用户,则以某种方式传递用户对象的服务方法所有这一切都应该发生而不进行第二次往返数据库

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

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

编辑:请检查我自己的方法的答案.不过问题很好,我得到的答案很有价值.

ale*_*ale 4

我们实现了自己的身份验证 HTTP 模块。该模块挂钩 HttpApplication 的“根据请求进行身份验证”事件,并对后端运行身份验证。后端可以自由地返回它想要的任何内容(在我们的例子中,它返回的不仅仅是是/否。返回的对象实现了 System.Security.Principal.IIdentity 接口。一旦身份验证成功,我们就附加身份(由auth) 到 HttpContext.User 中携带的主体。

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

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