自托管 WCF REST 服务和基本身份验证

2024-05-17

我创建了一个自托管的 WCF REST 服务(带有 WCF REST Starter Kit Preview 2 中的一些额外内容)。这一切工作正常。

我现在正在尝试向服务添加基本身份验证。但我在 WCF 堆栈中遇到了一些相当大的障碍,这阻止了我这样做。

看来HttpListener(自托管 WCF 服务在 WCF 堆栈的低级别内部使用)阻止了我插入WWW-Authenticate自行生成的标头401 Unauthorized回复。为什么?

如果我忘记了这一点,我可以让身份验证工作WWW-Authenticateheader(微软似乎也这么做了)。但这就是问题所在。如果我不发回WWW-Authenticate标头,则 Web 浏览器将不会显示其标准“登录”对话框。用户将仅仅面临一个401 Unauthorized错误页面,无法实际登录。

REST 服务应该可供计算机和人类访问(至少在 GET 请求级别)。因此,我觉得 WCF REST 在这里不符合 REST 的基本部分。有人同意我的观点吗?

有人使用自托管 WCF REST 服务进行基本身份验证吗?如果是这样,你是怎么做到的?

PS:显然,我打算使用不安全的基本身份验证的前提是我也能让 HTTPS/SSL 为我的服务工作。但那是另一回事了。

PPS:我已经尝试过 WCF REST Contrib (http://wcfrestcontrib.codeplex.com/ http://wcfrestcontrib.codeplex.com/)并且有完全相同的问题。该库似乎尚未在自托管场景中进行测试。

Thanks.


不幸的是,我已经确定(通过分析 WCF 参考源代码以及用于 HTTP 会话嗅探的 Fiddler 工具的帮助)这是 WCF 堆栈中的一个错误。

使用 Fiddler,我注意到我的 WCF 服务的行为与使用基本身份验证的任何其他网站不同。

需要明确的是,这是应该发生的事情:

  1. 浏览器发送GET请求时不知道甚至需要密码。
  2. Web 服务器拒绝请求401 Unauthorized状态并包括WWW-Authenticate标头包含有关可接受的身份验证方法的信息。
  3. 浏览器提示用户输入凭据。
  4. 浏览器重新发送GET请求并包括适当的Authentication带有凭据的标头。
  5. 如果凭据正确,Web 服务器会响应200 OK和网页。 如果凭据错误,Web 服务器会响应401 Unauthorized并包括相同的WWW-Authenticate它在步骤 #2 中执行的标头。

我的 WCF 服务实际发生的情况是这样的:

  1. 浏览器发送GET请求时不知道甚至需要密码。
  2. WCF 通知没有Authentication请求中的标头并盲目拒绝带有401 Unauthorized状态并包括WWW-Authenticate标头。目前为止一切正常。
  3. 浏览器提示用户输入凭据。还是正常的。
  4. 浏览器重新发送GET请求包括适当的Authentication header.
  5. 如果凭据正确,Web 服务器会响应200 OK。一切皆好。 但是,如果凭据错误,WCF 会响应403 Forbidden并且不包含任何附加标头,例如WWW-Authenticate.

当浏览器获取到403 Forbidden状态 它不会认为这是一次失败的身份验证尝试。此状态代码旨在通知浏览器它尝试访问的 URL 不受限制。它与身份验证没有任何关系。这会产生可怕的副作用,即当用户错误地输入用户名/密码(并且服务器以 403 拒绝)时,Web 浏览器不会重新提示用户再次输入其凭据。事实上,网络浏览器认为身份验证已成功,因此会为会话的其余部分存储这些凭据!

考虑到这一点,我寻求澄清:

RFC 2617(http://www.faqs.org/rfcs/rfc2617.html#ixzz0eboUfnrl http://www.faqs.org/rfcs/rfc2617.html#ixzz0eboUfnrl)没有在任何地方提到使用403 Forbidden状态码。事实上,它对此事的实际说法如下:

如果源服务器不希望 接受通过 a 发送的凭据 请求,它应该返回 401 (未经授权)回应。响应 必须包含 WWW-Authenticate 标头 字段至少包含一个 (可能是新的)挑战适用于 所请求的资源。

WCF 两者都不做。它既不正确发送401 Unauthorized状态码。它也不包括WWW-Authenticate header.

现在在 WCF 源代码中找到确凿的证据:

我发现在HttpRequestContext类是一个名为的方法ProcessAuthentication,其中包含以下内容(摘录):

if (!authenticationSucceeded) 
{
   SendResponseAndClose(HttpStatusCode.Forbidden);
}

我在很多事情上都为微软辩护,但这是站不住脚的。

幸运的是,我已经让它工作到了“可接受的”水平。这只是意味着,如果用户不小心输入了错误的用户名/密码,那么再次尝试的唯一方法是完全关闭其网络浏览器并重新启动以重试。这一切都是因为 WCF 是not响应失败的身份验证尝试401 Unauthorized and a WWW-Authenticate标头按照规范。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自托管 WCF REST 服务和基本身份验证 的相关文章

  • Django Rest Framework 完整性错误捕获

    在 Django Rest Framework 中 我使用了序列化器 视图集和路由器方法 每当我在 django Rest 框架的 API 视图中发布故意错误时 它都会抛出完整性错误 有没有办法尝试捕获错误 例如如果数据中没有错误 则继续保
  • 有 Objective-C Web 框架吗?

    有 Objective C Web 框架吗 我发现的唯一框架是 frothkit 我主要寻找一种在 Objective C 中编写 RESTful json Web 服务的方法 GNUStepWeb http wiki gnustep or
  • RESt api:根据身份验证对资源和内容进行识别

    我正在设计一个遵循 HATEOAS REST 原则的 API 但我不确定这个基本点 资源识别 假设这个网址 images它公开了用户 向该用户 上传的所有图像 假设我使用 oauth 访问令牌进行身份验证 images 的内容将根据授权标头
  • RESTful 资源 - 接受对象列表

    我正在构建一个 RESTful 资源集合 其工作方式如下 我将使用 人 作为示例 GET people key returns a person object JSON GET people first name Bob returns a
  • 使用 WCF 和 .NET 4.0 在 C# 中实现 SOAP 客户端

    我在 NET 4 0 中开始使用 WCF 时遇到问题 这是我的情况 我用 PHP 创建了一个小型 SOAP 服务器 我有一个 C 项目 我想在其中连接到此服务器并启动 SOAP 通信 我的问题是 我不知道如何在 C 中执行此操作 我找不到
  • 与 parse-server 和 auth0 的自定义身份验证集成

    我想将 auth0 com 与开源解析服务器结合使用 我当前的方法是通过 iOS 的 Lock 库使用标准登录从 auth0 获取令牌 使用该令牌 我想在解析服务器上调用自定义身份验证方法 该方法检查令牌是否有效 如果有效则将登录用户 我的
  • 如何从互联网访问本地网络内的服务器

    假设我有一个服务器应用程序在未直接连接到互联网但通过路由器连接的计算机上工作 所以问题是如何从不在内部网络 从互联网 内的另一台计算机连接到该服务器 据我所知 管理员可以配置路由器将指定端口请求重定向到该计算机 但我可以自动执行此操作吗 我
  • Facebook 身份验证无需重定向?

    有没有办法在不重定向的情况下使用 facebook 身份验证 OAuth 2 0 我没有使用 facebook 登录按钮 所以我应该重定向到https www facebook com dialog oauth https www face
  • 如何在 C# 中向肥皂信封添加命名空间

    我想向我的肥皂信封添加命名空间设置 我想在 IClientMessageInspector 的 BeforeSendRequest 中更改它 或者您有更优雅的方法 例如
  • OkHttp Authenticator 有时不会调用多个 Retrofit 实例的验证

    我有两个不同的Retrofit两个不同 API 的实例 我也有两个不同的OkHttp3客户 但他们共享相同的Authenticator因为两个 API 的身份验证令牌是相同的 问题是当令牌过期时有时 但几乎总是 其中之一Retrofit O
  • 具有 HTTP 基本身份验证的 PhoneGap FileTransfer

    我正在尝试使用以下命令将文件从 PhoneGap 上传到服务器文件传输方法 http docs phonegap com en 1 6 1 cordova file file md html FileTransfer 我需要为此上传启用 H
  • REST API 路由最佳实践

    我想知道当订单是一种资源时 为以下场景创建 REST API 的最佳实践是什么 获取数据库中的所有订单 当然不是实际场景 仅供理解 通过订单ID获取订单 根据订单ID获取单个订单 单个 GET 路由是否可以用于所有这些场景 或者我们应该针对
  • powershell:使用参数启动程序的脚本?

    当我运行下面的 Powershell 脚本时 我收到以下错误 如何通过 powershell 带参数运行程序 该脚本将是组策略登录 Invoke Expression 找不到位置参数 接受参数 TBHSERVER NETLOGON BGIn
  • OpenID 和 OAuth 之间有什么区别?

    我真的想了解 OpenID 和 OAuth 之间的区别 也许它们是两个完全不同的东西 OpenID http openid net 是关于身份验证 即证明您是谁 OAuth http oauth net 是关于授权的 即授予对功能 数据 等
  • 如何在 Jersey RESTful Web 服务中放置 cookie?

    我想通过 Jersey API 将 cookie 从 PUT webservice result 放置到 POST webservice 这是我的代码 WebResource service1 client resource http te
  • 为什么当尝试使用 $this->data 访问 CakePHP 时,密码字段为空?

    我正在实现一个身份验证组件 这是我的注册页面 create User array action gt login echo form gt input primary email array size gt 32 echo form gt
  • Heroku 上的 Google Vision API 身份验证

    在 Heroku 上验证 Vision API 的最佳 简单方法是什么 在开发中我只使用 vision Google Cloud Vision new project instacult keyfile path to keyfile js
  • WCF获取证书编码值

    我在 WCF 服务中使用证书 因此在 web Config 中有一个编码值
  • ChangeState 之后重置/卸载控制器(调用注销)。 AngularJS

    我正在创建一个应用程序 用户可以从 Facebook 或 Twitter 登录 登录后 用户将被定向到某个主页 在这里 控制器加载并调用我的初始函数 该函数加载特定于该用户的数据 当用户单击 注销 时 令牌将被清除 用户将被定向到登录页面
  • asp.net cookie、身份验证和会话超时

    我有一个使用表单身份验证的 asp net 网站 我在会话中保留一些信息 例如用户名 用户 ID 电子邮件等 我通过在身份验证 cookie 上设置较长的到期日期来允许用户保持登录网站的状态 因此 当用户仍处于身份验证状态时 会话过期的情况

随机推荐

  • C++11 函数局部静态 const 对象的线程安全初始化

    这个问题已在 C 98 上下文中提出 并在该上下文中得到回答 但没有明确说明有关 C 11 的内容 const some type create const thingy lock my lock some mutex static con
  • 如何定义“f_n-chi-square”函数并使用“uniroot”求置信区间?

    I want to get a 95 confidence interval for the following question 我已经写了函数f n在我的 R 代码中 我首先使用 Normal 随机采样 100 个样本 然后定义函数h
  • HashMap 值需要不可变吗?

    我知道 HashMap 中的键需要是不可变的 或者至少确保它们的哈希码 hashCode 不会改变或与另一个具有不同状态的对象发生冲突 但是 HashMap中存储的值是否需要与上面相同 为什么或者为什么不 这个想法是能够改变值 例如在其上调
  • 使用 pybtex 将 bibtex 转换为格式化的 HTML 参考书目,例如哈佛风格

    我正在使用 Django 并将 bibtex 存储在我的模型中 并且希望能够以格式化 HTML 字符串的形式向我的视图传递引用 使其看起来像哈佛引用样式 使用中描述的方法Pybtex 无法识别 bibtex 条目 https stackov
  • 如何用 kevent() 替换 select() 以获得更高的性能?

    来自Kqueue 维基百科页面 http en wikipedia org wiki Kqueue Kqueue 在内核和用户空间之间提供高效的输入和输出事件管道 因此 可以修改事件过滤器以及接收待处理事件 同时每次主事件循环迭代仅使用对
  • 如何在bash中使用jq从变量中包含的json中提取值

    我正在编写一个 bash 脚本 其中存储了一个 json 值 现在我想使用 Jq 提取该 json 中的值 使用的代码是 json val code lyz1To6ZTWClDHSiaeXyxg redirect to http examp
  • 在 C# 中将位从 ulong 复制到 long

    所以看来 NET 性能计数器类型 http msdn microsoft com en us library system diagnostics performancecounter aspx有一个恼人的问题 它暴露了long对于计数器
  • 将构建参数传递给 .wxs 文件以动态构建 wix 安装程序

    我是一名学生开发人员 我已经为我现在工作的公司构建了几个安装程序 所以我对WIX还是比较熟悉的 我们最近决定拥有一个构建服务器来自动构建我们的解决方案 它构建调试和发布以及混淆 和非混淆 项目 你真的不需要理解这些 您需要了解的是 我有相同
  • 转到 C# WPF 中的第一页

    我正在 WPF 中使用导航服务 为了导航到页面 我使用 this NavigationService Navigate new MyPage 为了返回我使用 this NavigationService GoBack 但是如何在不使用的情况
  • 如何使用 vanilla JS 实现可维护的反应式 UI

    今天我遇到了一个问题 可以通过使用像 Vue 这样的反应式和状态管理框架来轻松解决 遗憾的是 无法使用它 以下 简化 情况 链接到代码笔 https codepen io theiaz pen BazErKV 我们有一个服务器渲染的页面 其
  • XAML 中的 CSS 等效项

    在 Web 开发中 样式表非常常用 Swing 中有用于处理 GUI 的布局管理器 我关于 XAML 应用这些范例之一的假设是否正确 两个都 在这种情况下 哪一个是首选 我已经检查过 Intellisense 但除了Style领域 我没有发
  • 如何在 Angular 项目中使用 Bootstrap?

    我开始我的第一次Angular应用程序和我的基本设置已完成 我怎样才能添加引导程序我的申请 如果您可以提供一个示例 那么这将是一个很大的帮助 如果您使用Angular CLI要生成新项目 还有另一种方法可以使 bootstrap 可访问角度
  • 是否有与 C++11 emplace/emplace_back 函数类似的 C# 函数?

    从 C 11 开始 可以写类似的东西 include
  • IntelliJ IDEA 覆盖 $user

    这是一个非常简单的问题 但我无法使用 SO Search 和 Google 找到答案 是否可以覆盖默认值 userVTL变量在文件模板中全局使用 而不是在每个模板中设置它 set user 就像 IntelliJ 本身的某种设置脚本一样 我
  • 有没有办法在 MS Windows(Powershell 或 CMD)的 ripgrep 中转义引号?

    我想找一个字符串 Hello Hello 以双引号开头 在文本文件中使用ripgrep 通常 在 Bash 或 ZSH 中 这可以通过用反斜杠转义或用单引号括起来来实现 rg Hello rg Hello 然而 在 MS Windows P
  • NSCFData fastCharacterContents 崩溃? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我目前在控制台中收到此崩溃日志 20
  • Oracle即时客户端和Oracle客户端之间的区别

    Oracle即时客户端和Oracle客户端有什么区别 你能给我解释一下吗 谢谢 Oracle 客户端附带一个安装程序和许多可执行文件 例如 sqlplus tnsping 很完整而且很大 Oracle Instant 客户端是一个基本的轻量
  • 获取点击的的DOM路径

    HTML div class lol a class rightArrow href a div 伪代码 rightArrow click function rightArrowParents this dom dom is the pse
  • 在 Android 中上传文件出现内存不足错误

    我的上传代码如下 String end r n String twoHyphens String boundary try URL url new URL ActionUrl HttpURLConnection con HttpURLCon
  • 自托管 WCF REST 服务和基本身份验证

    我创建了一个自托管的 WCF REST 服务 带有 WCF REST Starter Kit Preview 2 中的一些额外内容 这一切工作正常 我现在正在尝试向服务添加基本身份验证 但我在 WCF 堆栈中遇到了一些相当大的障碍 这阻止了