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