使用承载令牌时,VS2013 MVC / WebApi项目模板返回401

时间:2013-11-13 05:55:35

标签: oauth asp.net-web-api owin

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

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

  1. 在VS2013中,执行文件 - >新项目 - >网络 - >单页申请
  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文件,将整个网址值(开头“/”除外)复制并粘贴到地址栏中地址的末尾,然后按回车键 - 您应该被带到Google进行身份验证。
  6. 一旦您通过身份验证,您将被重定向回SPA应用程序 - 忽略“外部登录失败”。错误消息。
  7. 在使用Google进行身份验证后,查看Fiddler跟踪信息,了解您的应用的第一个请求。突出显示该请求,然后单击Inspectors选项卡,然后查看响应的标题。
  8. 将“传输”部分下的“位置”标题复制并粘贴到记事本中,然后仅复制access_token片段的值。
  9. 在Fiddler中,单击Composer选项卡并将默认URL修改为您在上面的步骤3中创建的控制器操作的URL。
  10. 在“请求标头”区域中,在“用户代理”标题下添加以下内容:

    Authorization: Bearer [access_token]
    

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

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

  12. 如果您按照上面的步骤1-11进行唯一更改,则选择具有个人用户帐户作为身份验证类型的MVC / WebApi,然后您将在步骤11中获得HTTP 401,而不是具有相应返回数据的HTTP 200。

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

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

    赖安

1 个答案:

答案 0 :(得分:0)

在我的情况下,我必须启用WebAPI才能使用承载令牌,否则我将始终获得401.WebAPIs与主MVC / Owin应用程序配置并行配置。 WebApiConfig.cs中的行config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));解决了我的问题:

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的承载令牌身份验证进行身份验证。