将 ASP.NET Core 部署到 IIS UI 和 API 到单独的网站

Posted

技术标签:

【中文标题】将 ASP.NET Core 部署到 IIS UI 和 API 到单独的网站【英文标题】:Deploy ASP.NET Core to IIS UI and API into seperated websites 【发布时间】:2020-03-08 23:35:35 【问题描述】:

拥有包含 UI 和 API 的解决方案。

用户界面

是一个 ASP.NET Core MVC 项目,仅包含 HomeControllerIndex 视图,该视图在 VueJS 应用程序中加载。

API

是一个ASP.NET Core Web API,用于使用 Windows 身份验证提供 VueJS 应用程序。

部署

当前设置(1 个 IIS 网站)

我们有一个来源 (https://example.com),API 由 https://exampel.com/api 访问

新设置(2 个 IIS 网站)

UI 有 2 个来源 (https://app.example.com),API 有 (https://api.example.com)。

对于新设置,我们需要实现 CORS(跨域)以允许其他网站使用 API。但因此我们需要为OPTIONS preflight 请求启用匿名身份验证。

有没有办法防止这种情况发生?

【问题讨论】:

Enable Cross-Origin Requests (CORS) in ASP.NET Core 这应该会有所帮助。 @aguafrommars 我做了所有这些,但要使其正常工作,我需要将匿名身份验证设置为 true 以允许来自 CORS 的 OPTIONS 请求。问题是要使其安全,或者是否有其他解决方案可以禁用匿名身份验证但让 CORS 正常工作 你的意思是在 IIS 上?还是使用 ASP.Net Core 身份验证和授权中间件? 没有办法避免需要允许未经身份验证的 OPTIONS 请求。 CORS 协议需要它。更具体地说,CORS 协议要求浏览器从 CORS 预检 OPTIONS 请求中省略所有凭据。 【参考方案1】:

设法使用自定义中间件进行身份验证来解决它:

public async Task InvokeAsync(HttpContext context)

    // Check if the request is a PREFLIGHT => OPTIONS request
    if (context.User.Identity.IsAuthenticated || context.Request.Method == "OPTIONS")
    
        await _next(context);
        return;
    

    await context.ChallengeAsync("Windows");

并在启动时在管道的开头添加:

app.UseMiddleware<AuthenticationMiddleware>();

【讨论】:

以上是关于将 ASP.NET Core 部署到 IIS UI 和 API 到单独的网站的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core部署系列一:发布到IIS上

将 asp.net core web api 部署到 IIS 7.5 时出现 500 错误

如何将针对 net452 项目的 ASP.NET Core 部署为 IIS 中网站的 IIS 应用程序

ASP.NET Core--.net core 3.1 部署到 IIS

ASP.NET Core Web 应用程序开发期间部署到IIS自定义主机域名并附加到进程调试

ASP.NET Core 部署到 IIS 错误:不应在已部署的应用程序中启用开发环境