要求:
WCF 4.0 IIS 主机 基本认证与自定义来源 RESTful
有很多例子和方法可以实现基本认证,从使用 UserNamePasswordValidator,到 ServiceAuthorizationManager 和 IDispatchMessageInspector 等等。
我面临的问题是,验证实际上将从身份验证后端获取比是/否答案更多的信息。而我想以某种方式将此信息传递给被调用的服务方法(即它将是完整的 User 对象,具有许多属性来控制服务行为)。我想避免根据用户名从用户存储库检索数据的第二个调用,因为我可以从安全上下文中访问它。
到目前为止,我找到的最接近的解决方案是 this solution,它使用了 WCF REST Starter Kit 的 RequestInterceptor,在其中我可以注入 ServiceSecurityContext 的子类来携带我的数据,并在服务方法中将 ServiceSecurityContext.Current 转换回来。
以上的问题在于,它是针对 WCF 3.5 编写的,而我想避免使用 Starter Kit。
问题:您有没有任何想法,在哪里挂接链条是最合适的地方,以便我可以从验证逻辑传递数据到服务。换句话说,我在哪里能够使用我的自定义安全上下文来替换它以继续负载?或者任何其他承载机制?我要的行为是:
客户端(可以是浏览器)尝试使用服务:GET https://myservcer/service/data 服务器响应“需要基本身份验证” 客户端提供基本身份验证标头并再次发送请求 服务器根据标头中的用户名/密码从数据库中拉出一个用户对象。 如果找不到用户,请重新请求认证 如果找到用户,则将User对象传递给服务方法 所有这些都应该发生而不会使第二次往返到数据库。
到目前为止,我了解到的是,UserNamePasswordValidator不会做到这一点 - 如果我在那里检索用户对象,没有办法传递用户对象。
我可以创建自定义IAuthorizationPolicy或SecurityToken(哪一个),并将User对象放入其中。 但是...这应该发生在哪里。 我可以用UserNameSecurityTokenAuthenticator吗? 它会返回正确的HTTP错误代码以要求凭据吗? 我在哪里修改web.config以使用我的自定义内容? 到目前为止,我只看到如何设置仅使用自定义UserNamePasswordAuthenticator。
编辑:请查看我的回答了解我的方法。尽管如此,问题很好,我得到的答案很有价值。