Web 应用程序之间的 Asp.Net Core DataProtection 无法在 Azure 上运行
Posted
技术标签:
【中文标题】Web 应用程序之间的 Asp.Net Core DataProtection 无法在 Azure 上运行【英文标题】:Asp.Net Core DataProtection between Web Apps not working on Azure 【发布时间】:2019-07-12 10:45:41 【问题描述】:我有两个在 Azure 上运行免费层服务计划的 WebApp。有一种情况,我从 WebApp A 生成身份重置密码令牌并在 WebApp B 中使用它。
在我的 Startup.cs 中,我在 ConfigureServices 方法中有如下 DataProtection 设置:
services.AddDataProtection().SetApplicationName("appname");
它在本地运行良好,但是当我尝试在这种情况下重置密码时,我在 Azure 上收到 Invalid Token 错误消息。
我正在运行带有 Identity Core 的 ASP.NET Core 2.1。此 DataProtection 设置是否有任何 Azure 限制或与免费层服务计划有关?
谢谢!
【问题讨论】:
我认为 Azure 免费层应该拥有对数据保护 API 的完全访问权限。查看 Microsoft documentation,似乎有一些非常明确的说明可以确保您在应用程序中使用完全相同的数据保护 API 堆栈。所以,我不得不问...我们是否 100% 确定 WebApp A 和 WebApp B 都使用相同的数据保护 API? @TroyWitthoeft ,两者的配置与我之前发布的代码完全相同,并且两个项目都具有版本 2.1.1 的 Microsoft.AspNetCore.DataProtection 程序集。还有什么需要配置的吗? @Markissimo 您在使用 IdentityServer 吗?然后,您可以使用授权代理令牌委托从 API A 用于 API B。如果您使用简单的 oauth 实现,那么两个服务器包含不同的 IS 数据库实例(或内存中)并且不知道彼此的令牌跨度> @Markissimo 您是如何配置数据保护的?默认设置为suitable for a single machine only。除非它们在 same 机器上运行,否则您将无法跨 Web 应用使用令牌。原因是数据保护服务默认使用机器的加密密钥进行加密 @Markissimo 这也不特定于 Azure。在任何 ASP.NET Web 场中都会出现同样的问题。这就是为什么the machine key has to be configured on all servers in a farm 【参考方案1】:APS.NET (Core) 在 IIS 服务器和 Azure Web 应用程序上的工作方式存在一些差异。虽然这不完全是限制(在这种情况下你会得到一些错误),但有些事情在技术上是行不通的。据我所知,您在 Web 应用程序中没有自己的虚拟服务器,而是有一个服务器池,任何时候任何服务器都可以专用于您的任务。这会使某些事情无法正常工作,如果您检测到差异,几乎可以肯定是由于这个原因。
另外值得注意的是,测试它是否仅限于免费层将花费您不到 1 美元,因此测试它可能比询问它更好,只是我不知道免费的任何 API 限制层。
【讨论】:
【参考方案2】:如果你想在应用程序之间共享 cookie ASP.Net core ASP.net 应用试试这篇文章 https://docs.microsoft.com/en-us/aspnet/core/security/cookie-sharing?view=aspnetcore-2.2`
services.AddDataProtection()
.PersistKeysToFileSystem(GetKeyRingDirInfo())
.SetApplicationName("SharedCookieApp");
services.ConfigureApplicationCookie(options =>
options.Cookie.Name = ".AspNet.SharedCookie";
);`
【讨论】:
检查必须不同的域名。 options.Cookie.Domain = ".contoso.com";以上是关于Web 应用程序之间的 Asp.Net Core DataProtection 无法在 Azure 上运行的主要内容,如果未能解决你的问题,请参考以下文章
[WEB API ]ASP.NET CORE WEB API 调用WebService数据
在 Azure Service Fabric 中,无状态 Web API 和 ASP.NET Core Web API 之间有啥区别?
ASP.NET Core Web API - JWT 消息处理程序 - 没有注册类型错误