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

标签 iis c#-4.0 basic-authentication wcf-4

要求:

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

从使用 UserNamePasswordValidator 开始,有很多示例和方法来实现基本身份验证。 , 低谷 ServiceAuthorizationManagerIDispatchMessageInspector , ETC。

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

到目前为止,我找到的最接近的是 this solution ,它使用 WCF REST Starter Kit的 RequestInterceptor,我可以在其中注入(inject)一个 ServiceSecurityContext 的子类来承载我的数据,并将 ServiceSecurityContext.Current 转换回服务方法中。

上面的问题是,它是为 WCF 3.5 编写的,我想避免使用 Starter Kit。

问题:知道在链中最合适的位置是什么,所以我可以将数据从验证逻辑传递给服务。或者换一种说法,我可以用我的自定义上下文替换安全上下文以进行负载?还是其他任何载体机制?

我追求的是这种行为:

客户端(可能是浏览器)尝试使用服务:GET https://myservcer/service/data
服务器响应“需要基本身份验证”
客户端提供 Basic Authentication Header 并再次发送请求
服务器根据 header 中的用户/密码,从数据库中提取一个用户对象。
如果没有找到用户,再次请求认证
如果找到用户,则以某种方式将 User 对象传递给服务方法
所有这一切都应该发生,而无需第二次往返数据库

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

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

编辑:请检查 my own answer对于我的方法。不过这个问题很好,我得到的答案很有值(value)。

最佳答案

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

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

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

关于iis - 如何使用基本身份验证将比用户名/密码更多的数据传递给 WCF 4.0 RESTful 服务中的服务方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6823109/

相关文章:

asp.net-mvc - 登录后如何通过 MVC 提供静态文件(我正在尝试向我的大型 MVC 项目添加一个 Angular 迷你 SPA)

sql-server - sql geography 到 dbgeography?

http - 批量请求 MIME 类型的 IIS 压缩设置 'multipart/mixed'

iis - NAnt Web 应用程序部署

php - 如何在 Azure 中启用 PUT 请求?

ios - 使用 AVAudioPCMBuffer 将浮点值写入 C# 中的浮点指针数组(不安全或安全)

c#-4.0 - 在 C# 中在运行时更改命名空间

ssl - msmdpump.dll 忽略基本身份验证

c# - 错误 - 不允许连接字符串名称属性

php - 为什么 $_SERVER ["PHP_AUTH_USER"] 和 $_SERVER ["PHP_AUTH_PW"] 没有设置?