Asp.net mvc 从MVC控制器调用Web API(cookie身份验证)

Asp.net mvc 从MVC控制器调用Web API(cookie身份验证),asp.net-mvc,asp.net-web-api,bearer-token,Asp.net Mvc,Asp.net Web Api,Bearer Token,我在同一个项目上有一个WebAPI和MVC5。 该Web Api受承载令牌保护(但我对SuppressDefaultHostAuthentication行进行了注释,以便在使用cookie mvc进行身份验证时可以从浏览器访问Api) 现在,我正在尝试从mvc控制器访问api,而不发送令牌,这在SuppressDefaultHostAuthentication关闭的情况下是可能的吗 尝试但未成功(401错误): 如果这是不可能的,那么处理这个问题的最佳方法是什么 WebApi遵循REST,RES

我在同一个项目上有一个WebAPI和MVC5。 该Web Api受承载令牌保护(但我对SuppressDefaultHostAuthentication行进行了注释,以便在使用cookie mvc进行身份验证时可以从浏览器访问Api)

现在,我正在尝试从mvc控制器访问api,而不发送令牌,这在SuppressDefaultHostAuthentication关闭的情况下是可能的吗

尝试但未成功(401错误):


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

WebApi遵循REST,REST规定请求是无状态的。这意味着对于WebApi或任何与REST兼容的API,没有任何概念,例如cookie、会话等。对API的每个请求必须包含服务请求所需的所有信息。因此,如果有需要身份验证的端点,则必须对请求进行身份验证才能访问该端点。时期如果您正在通过承载令牌进行身份验证,则必须传递承载令牌。

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

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


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

从技术上讲,这可能会起作用,但这只是因为像普通类一样实例化控制器(而不是通过请求管道)绕过一些属性,例如
Authorize
(因为它在请求管道的上下文中工作)。但是,这样做,如果在操作中依赖身份验证(即
用户
),就会出现问题。最好将Web Api操作中的代码分解到类库中,这样Web Api和MVC项目都可以利用,而不是直接在请求管道之外使用Web Api。
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)
     {  }
}