1

所以这可能需要在“你做错了”下归档,但我无法获得默认 VS2013 MVC5/WebApi 项目模板返回的 OAuth access_token 来成功验证 WebApi 请求。有趣的是,VS2013 SPA 项目模板似乎运行良好。

这应该可以通过以下步骤重现:

  1. 在 VS2013 中,执行 File -> New Project -> Web -> Single Page Application
  2. 在 Startup.Auth.cs 中取消注释该行:

    app.UseGoogleAuthentication();
    
  3. 创建一个新的 WebApi 控制器和一个 GET 操作以返回一些数据并将 [Authorize] 属性添加到控制器。

  4. 启动 Fiddler,F5 调试应用程序,然后浏览到:

    http://localhost:<your_port>/api/account/ExternalLogins?returnUrl=%2F&generateState=true
    
  5. 打开从第 4 步返回的 json 文件,将整个 url 值(开头的“/”除外)复制并粘贴到地址栏中地址的末尾,然后按 Enter - 您应该被带到 Google 进行身份验证。
  6. 一旦您通过身份验证,您将被重定向回 SPA 应用程序 - 忽略“外部登录失败”。错误信息。
  7. 在通过 Google 进行身份验证后,查看 Fiddler 跟踪以了解对您的应用的第一个请求。突出显示该请求并单击 Inspectors 选项卡,然后查看响应的标头。
  8. 将 Transport 部分下的 Location 标头复制并粘贴到记事本中,然后仅复制 access_token 片段的值。
  9. 在 Fiddler 中,单击 Composer 选项卡并将默认 URL 修改为您在上面的步骤 3 中创建的控制器操作的 URL。
  10. 在请求标头区域中,在 User-Agent 标头下方添加以下内容:

    Authorization: Bearer [access_token]
    

    其中 [access_token] 是您从上述第 8 步复制的值。

  11. 执行请求,您应该会在 Fiddler 跟踪中看到 HTTP 200。在 Inspectors 选项卡中查看原始响应应该会显示您从 WebApi 方法返回的值。

如果您按照上面的步骤 1-11 进行操作,唯一的变化是您选择具有个人用户帐户的 MVC/WebApi 作为身份验证类型,那么您将在步骤 11 中获得 HTTP 401,而不是带有适当返回数据的 HTTP 200。

说了这么多,难道我做错了吗?据我所知,这两个项目模板在 OAuth/安全设置方面几乎相同(web.config 中的一些细微差异,但更改这些似乎没有什么不同)。

提前感谢您提供的任何帮助 - 在过去的几个晚上,我一直在用头撞桌子......

瑞安

4

1 回答 1

0

在我的情况下,我必须启用 WebAPI 才能使用不记名令牌,否则我总是会得到 401。WebAPI 与主 MVC/Owin 应用程序配置并行配置。config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));WebApiConfig.cs 中的行解决了我的问题:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.SuppressDefaultHostAuthentication();

        // Configure Web API to use only bearer token authentication.
        config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

        // Web API routes
        config.MapHttpAttributeRoutes();
        ...
    }
}

这会导致 WebApi 通过 Owin 的不记名令牌身份验证进行身份验证。

于 2015-01-05T19:28:50.290 回答