SPA 模板中的 Web API 在传递用户名和密码时返回状态 401 Unauthorized

Posted

技术标签:

【中文标题】SPA 模板中的 Web API 在传递用户名和密码时返回状态 401 Unauthorized【英文标题】:Web API in SPA template returning status 401 Unauthorized when passing username and password 【发布时间】:2013-04-02 16:19:21 【问题描述】:

在 SPA 模板中测试 WebAPI 身份验证时,我可以使用 Google Chrome 中的此 URL 创建用户、登录并检索示例待办事项:

http://myhost.com:49688/api/TodoList

当我尝试使用 curl 或通过 Fiddler 检索待办事项时,我返回 HTTP/1.1 401 Unauthorized 状态。

我正在使用的 curl 命令:

curl --request GET -H "Content-Type: application/json" http://uname:pass@myhost.com:49688/api/TodoList

提琴手 解析查询:

GET http://myhost.com:49688/api/TodoList

请求标头:

User-Agent: Fiddler
Host: localhost:49688
Authorization: Basic YWxpYmVyc29uOnRlc3R0ZXN0

如果我提供用户名和密码,为什么会收到返回状态 401? (我用 myhost 代替了 localhost)

【问题讨论】:

请求似乎没问题。尝试在服务器端进行调试。 @JackPoint 我在namespace SPA.Filters public class ValidateHttpAntiForgeryTokenAttribute : AuthorizationFilterAttribute public override void OnAuthorization(HttpActionContext actionContext) HttpRequestMessage request = actionContext.ControllerContext.Request; 上设置了一个断点,它没有被命中。我欢迎任何其他可以调试的建议。 【参考方案1】:

我认为您遇到了反 CSRF 过滤器。为防止跨站点请求伪造,客户端需要包含服务器注入 html 页面的验证令牌。这可以防止恶意网站捎带您的登录凭据。

请参阅“反 CSRF 保护”部分中的 http://www.asp.net/single-page-application/overview/introduction/knockoutjs-template。

更多背景信息:http://www.asp.net/web-api/overview/security/preventing-cross-site-request-forgery-(csrf)-attacks

【讨论】:

Mike,在您的帖子中,您描述了使用 Razor 语法在服务器上生成令牌,然后将令牌添加到 AJAX 请求:string cookieToken, formToken; AntiForgery.GetTokens(null, out cookieToken, out formToken); return cookieToken + ":" + formToken; 我可以使用相同的令牌方案针对 iPhone 验证 WebAPI原生应用客户端?也就是说,如果调用WebAPI的客户端是原生iPhone应用,那么原生应用客户端能否调用AntiForgery.GetTokens(...),然后在后续调用中使用接收到的token? 或者我应该使用完全不同的方法来保护 SPA 模板的 WebAPI,并在本机应用程序客户端的标头中使用令牌,例如 ***.com/questions/11731683/… ? GetTokens 在服务器端生成令牌。这个想法是将标记放在 HTML 中。这会强制客户端解析 HTML,以证明他们没有发出跨域请求。对于原生客户端,您通常希望直接调用 Web API 并将结果呈现在原生 UI 中,因此对于原生客户端来说,这不是一个很好的身份验证方案。 我只是更仔细地重新阅读了您的原始 Q - 开箱即用的 SPA 模板配置为表单身份验证,但您将凭据作为基本身份验证发送,它不会识别。 感谢您撰写有关基本身份验证的文章:asp.net/web-api/overview/security/basic-authentication 我想使用基于令牌的基本身份验证,您建议我遵循什么?此外,我如何结合本机 UI 客户端(使用基本身份验证)和 SPA javascript / ajax / 浏览器客户端(它不必是开箱即用模板)的身份验证,以便它们都可以调用并针对同一个 WebAPI 进行身份验证?

以上是关于SPA 模板中的 Web API 在传递用户名和密码时返回状态 401 Unauthorized的主要内容,如果未能解决你的问题,请参考以下文章

API/SPA 的用户注册

单页应用 SPA(Sigle Page Aolication)

如何在 SPA 应用程序中从 Web API 访问 Graph API

将 Azure App Service 应用程序设置传递给 SPA JS 应用程序

Web API 2 入门——使用ASP.NET Web API和Angular.js构建单页应用程序(SPA)(谷歌翻译)

使用 OAuth 访问 SPA 和 REST API 时,应该在哪里为 RBAC 存储用户组成员身份