将 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 到单独的网站的主要内容,如果未能解决你的问题,请参考以下文章