【问题标题】:Call a Web API from MVC controller (cookie authentication)从 MVC 控制器调用 Web API(cookie 身份验证)
【发布时间】:2016-10-06 11:54:33
【问题描述】:

我在同一个项目上有一个 Web Api 和 Mvc 5。 该 Web Api 受不记名令牌保护(但我评论了 SuppressDefaultHostAuthentication 行,因此当我使用 cookie mvc 进行身份验证时,我可以从浏览器访问 api)

现在我试图在不发送令牌的情况下从 mvc 控制器访问 api,是否可以关闭 SuppressDefaultHostAuthentication?

试过没有成功(401错误):

HttpClientHandler handler = new HttpClientHandler()
{
     PreAuthenticate = true,
     UseDefaultCredentials = true
};

using (var client = new HttpClient(handler))
{
     client.BaseAddress = new Uri("http://localhost:11374/");
     client.DefaultRequestHeaders.Accept.Clear();
     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

     var response = client.GetAsync("api/MyApi").Result;
     if (response.IsSuccessStatusCode)
     {  }
}      

如果不可能,那么处理该问题的最佳方法是什么?

【问题讨论】:

    标签: asp.net-mvc asp.net-web-api bearer-token


    【解决方案1】:

    由于 WebAPI 和 MVC 应用程序位于同一个项目中,您无需通过 HTTP 并发出请求即可访问每个应用程序的方法 - 它们是邻居 :)

    您可以将 WebAPI 视为普通类并在 MVC 控制器中对其进行实例化。之后,您可以像处理应用程序中的任何其他对象一样调用实例上的方法。

    但是,如果您利用通过 HTTP 的请求来访问它,则无法避免 WebAPI 设计的令牌和/或其他安全机制。

    【讨论】:

    • 从技术上讲,这可能有效,但只是因为像常规类一样实例化控制器(而不是通过请求管道)绕过了一些属性,如 Authorize(因为它在请求管道)。但是,以这种方式执行此操作,如果您在操作中完全依赖身份验证(即User),您将遇到问题。
    • 最好将 Web Api 操作中的代码分解到一个类库中,然后 Web Api 和 MVC 项目都可以使用,而不是尝试直接使用 Web Api在请求管道之外。
    【解决方案2】:

    WebApi 遵循 REST,其中规定请求是无状态的。这意味着对于 WebApi 或任何与 REST 兼容的 API,没有 cookie、会话等任何东西的概念。对 API 的每个请求都必须包含为请求提供服务所需的所有信息。因此,如果您有一个需要身份验证的端点,您必须对访问它的请求进行身份验证。时期。如果您通过不记名令牌进行身份验证,那么您必须传递不记名令牌。

    【讨论】:

      猜你喜欢
      • 2015-04-25
      • 1970-01-01
      • 1970-01-01
      • 2016-07-03
      • 2016-04-13
      • 1970-01-01
      • 2014-04-29
      • 2016-06-17
      • 1970-01-01
      相关资源
      最近更新 更多