我正在开发一个旧的 ASP.NET 4.8 Web 表单应用程序,其中包含一个 Web API。 Web 表单应用程序使用 Windows 身份验证,但任何类型的客户端都必须可以访问 API。 我必须仅禁用 API 的身份验证,Windows 身份验证必须保留为 Web 表单应用程序。 该API的客户端大部分来自Linux环境。
web.config就是这样设置的(只粘贴相关数据):
<authentication mode="Windows" />
<authorization>
<deny users="?" />
</authorization>
...
...
<location path="~">
<system.web>
<authorization>
<allow users="?" />
</authorization>
</system.web>
</location>
<location path="api">
<system.web>
<authorization>
<allow users="*" />
</authorization>
</system.web>
</location>
我尝试在
config.SuppressHostPrincipal();
类中添加 WebApiConfig
:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
config.SuppressHostPrincipal();
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "SaraApi",
routeTemplate: "api/{controller}/{Action}/{id}",
defaults: new
{
id = RouteParameter.Optional,
type = RouteParameter.Optional
}
);
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
}
}
我还在我的控制器中添加了
[AllowAnonymous]
装饰:
[AllowAnonymous]
public class WebApiController : CustomApiController
{
// Code...
}
但是我仍然遇到 401 - 未经授权的错误。我发现获得 200 响应的唯一方法是在我的 Windows 控制台测试客户端中设置
UseDefaultCredentials = true
中的 HttpClient
声明:
static HttpClient _client = new(new HttpClientHandler() { UseDefaultCredentials = true })
{
BaseAddress = new Uri("http://localhost:24650/")
};
我想我不能从 Linux 客户端使用这个。因此,我尝试找到一种方法,让每个人都可以访问该 API,而无需进行身份验证。我将在 API 中使用 JWT 来完成此操作。
删除 config.SuppressHostPrincipal(): 此设置绕过了整个应用程序的安全性。由于 web.config 处理 API 访问,因此没有必要。
Linux 客户端:
Linux 客户端无法访问默认的 Windows 凭据。您需要在 API 中实现 JWT 身份验证,以允许从 Linux 环境进行访问。客户端将在请求标头中发送 JWT 令牌以进行授权。