10

要求:

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

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

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

到目前为止,我找到的最接近的是这个解决方案,它使用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。

编辑:请检查我自己的答案以了解我的方法。不过这个问题很好,我得到的答案很有价值。

4

3 回答 3

4

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

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

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

于 2011-07-29T14:46:00.967 回答
0

您可以创建 IAuthorizationPolicy 的实现,并将主要身份替换为您在身份验证期间获得的身份。查看这些链接,这些链接显示了如何避免两次访问数据库:

WCF 自定义验证器:如何从自定义验证器初始化“用户”对象

实施自定义身份验证时何时何地设置自定义 IIdentity

于 2011-07-28T19:55:37.510 回答
0

我最终根本没有使用 WCF。Nancy更容易创建和测试 RESTFull API,并且通过最新的更改(它将在 0.8 版本中),我所问的问题非常简单。

于 2011-09-08T21:24:31.843 回答