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

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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开头的的地址。

查找了一圈原因,结果发现,这个之前也有人遇到了,具体的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"]

以上是关于ASP.NET Core 集成AAD认证在Docker中运行时要注意的一个问题的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core 中的混合身份验证(Windows 和 AAD JwtBearer)

在 Asp.Net Core Web 应用程序中使用 EasyAuth 对 Azure 应用服务上的 AAD 进行身份验证时,无法填充 ClaimsPrincipal

如何在ASP.NET Core中实现一个基础的身份认证

ASP.NET Core 实现自定义认证

在 Asp.Net Core 中什么是认证和授权

快速理解ASP.NET Core的认证与授权