gpt4 book ai didi

c# - 交换 Azure Web App 部署槽会注销 ASP.NET Core RC2 中的所有用户

转载 作者:太空狗 更新时间:2023-10-29 18:07:16 25 4
gpt4 key购买 nike

每当我更新作为 Azure Web 应用程序运行的 ASP.NET Core RC2 网站时,它都会注销所有用户。它似乎与将临时部署槽交换到生产环境有关(我使用从 VS 到临时部署的 Web 部署,并将其设置为自动交换到生产环境)。如果我直接更新生产插槽,那就没问题,但我不想这样做。我不知道如何配置它,我们将不胜感激!

这是我现在的配置方式,我的网站只允许直接登录(不允许 Facebook 登录等):

在启动的ConfigureServices中

// found some post that said this would help... doesn't seem to work...
services.AddDataProtection()
.SetApplicationName("myweb");

services.AddIdentity<MyUser, MyRole>(options =>
{
options.Cookies.ApplicationCookie.CookieDomain = settings.CookieDomain; // cookie domain lets us share cookies across subdomains
options.Cookies.ApplicationCookie.LoginPath = new PathString("/account/login");
options.Cookies.ApplicationCookie.ReturnUrlParameter = "ret";
options.Cookies.ApplicationCookie.CookieSecure = CookieSecureOption.Never; // TODO: revisit site-wide https

// allow login cookies to last for 30 days from last use
options.Cookies.ApplicationCookie.ExpireTimeSpan = TimeSpan.FromDays(60);
options.Cookies.ApplicationCookie.SlidingExpiration = true;

// I think this needs to at least be longer than cookie expiration to prevent security stamp from becoming invalid before the cookie?
options.SecurityStampValidationInterval = TimeSpan.FromDays(90);
})
.AddUserStore<MyUserStore>() // custom stores to hook up our old databases to new identity system
.AddRoleStore<MyRoleStore>()
.AddDefaultTokenProviders();

并在启动中配置

app.UseIdentity();

最佳答案

经过大量研究...我认为我可以做到这一点。

因此,对于任何想要一个使用身份信息进行登录的 ASP.NET Core RC2 网站、想要将其托管在 Azure Web 应用程序上、想要使用部署槽通过交换进行更新的人来说,希望每个用户在每次网站更新时都退出...继续阅读!

** 通常,Azure 会提供一些神奇的默认配置,使单个 Web 应用程序中的所有实例能够协同工作。部署槽的问题在于它本质上就像两个完全独立的 Web 应用程序,因此所有的魔力都消失了。

您需要正确配置数据保护才能使其正常工作。这有点令人困惑,因为 .NET Core Identity 的文档没有明确提及依赖或要求您正确配置数据保护,但它确实如此。数据保护是它在后台使用的内容来加密应用程序登录 cookie。

ConfigureServices 中需要以下代码:

services.AddDataProtection()
.SetApplicationName("myweb")
.ProtectKeysWithCertificate("thumbprint");

services.AddSingleton<IXmlRepository, CustomDataProtectionRepository>();

每部分的解释:

  1. 通过设置应用程序名称,您可以在使用同一应用程序名称的多个应用程序之间共享 protected 数据。可能并非所有场景都需要,但对我们来说不会造成伤害。
  2. 您需要使用在两个部署槽中保持一致的自定义 key 加密方法。默认值特定于每个部署槽,并且只能在该槽内使用。如果您查看 key encryption at rest ,Azure 默认情况下使用 Windows DPAPI。不会为我们的目的工作。所以我选择使用证书,只需输入 Azure 门户中看到的指纹即可。注意:对于那些讨厌证书及其相关术语的人来说,.NET Core 文档表示您需要一个支持 CAPI 私钥的 X.509 证书,否则它将无法工作。等等等等使用您为网站获得的 SSL 证书,它应该可以正常工作。
  3. 旁白:您必须进行一些额外的谷歌搜索才能真正使用证书。对于 Azure 来说,数据保护文档有点让您困惑……仅使用上面的代码,当您部署到 Azure 时,您可能会收到 500 错误。首先,确保您已将证书上传到 Web 应用程序的“自定义域和 SSL”部分。其次,您需要添加 WEBSITE_LOAD_CERTIFICATES 应用程序设置并将证书的指纹添加到其中才能使用它。请参阅 using certificates in azure websites
  4. 一旦您设置了证书来加密数据...它将消除有关存储数据位置的任何默认配置 - Azure 将其存储在所有实例默认情况下都可以访问的共享文件夹中(此处描述的默认值 data protection defaults )。但不同的部署槽是分开的......所以内置的文件系统和注册表选项没有帮助。您必须编写一个自定义实现,如下所述:key storage providers。但是哦等等...底部关于自定义 key 存储库的部分是一个单行代码,没有链接或解释如何连接它...您确实需要在这里阅读:key management,转到 IXmlRepository 部分。不幸的是,IDataProtectionBuilder 对所有内容都有方便的扩展,除了您需要在此处执行的操作之外,因此我们向服务提供商注册此自定义 IXmlRepository 的行。尽管该界面的通用名称令人震惊,但它只会影响数据保护,不会干扰您的其他内容。
  5. 未显示 CustomDataProtectionRepository 的实现。我使用 Azure blob 存储。这是一个非常简单的界面,如果您需要帮助,请发表评论。

天啊,我们终于让它工作了。丢失密码客户服务请求减少 500%;)

关于c# - 交换 Azure Web App 部署槽会注销 ASP.NET Core RC2 中的所有用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37849816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com