ASP.NET Core集成AAD认证在Docker中运行时要注意的一个问题

最近我在准备一个分享,就是基于.NET 6.0的云原生开发Microsoft 365应用,这个看起来很高大上的东东,其实我理解主要就是能把应用容器化,便于与环境无关地进行分发和部署。如果理解有误,请大家纠正我。

下面是其中的一个例子,请大家有空参考。分享会在5/6日的晚上,这是.NET 二十周年的一个活动,直播形式。具体请留意后续通知。.

https://github.com/chenxizhang/dotnet-graph-web/blob/master/README.MD

这里有一个问题,我折腾了很久,主要就是我这个范例应用用到了AAD做身份验证,也需要访问Microsoft Graph。 这个项目直接运行,或者部署都是可以正常运行的,但是如果用docker运行则可能会遇到下面的错误,就是说,我的网站其实是 https 开头的,但相关的中间件却会用 http 地址去作为 redirect URI ,这样自然是会报错的,因为AAD application里面注册的是(也必须是)https开头的的地址。

ASP.NET Core集成AAD认证在Docker中运行时要注意的一个问题

查找了一圈原因,结果发现,这个之前也有人遇到了,具体的bug讨论在这里 https://github.com/AzureAD/microsoft-identity-web/issues/115。 

一个解决方案是,在Dockerfile 中加入下面这样一行

ENV ASPNETCORE_FORWARDEDHEADERS_ENABLED=true

然后,整个世界清净了。

完整的Dockerfile定义如下

# https://hub.docker.com/_/microsoft-dotnet
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /source

# 复制文件
COPY *.csproj .
RUN dotnet restore

# 编译
COPY . .
WORKDIR /source
RUN dotnet publish -c release -o /app --no-restore

# 最后处理
FROM mcr.microsoft.com/dotnet/aspnet:6.0
WORKDIR /app
COPY --from=build /app ./
EXPOSE 80
EXPOSE 443
# 下面这一句特别关键,否则会出现错误
ENV ASPNETCORE_FORWARDEDHEADERS_ENABLED=true
ENTRYPOINT ["dotnet", "graphweb.dll"]