簡體   English   中英

數據保護 - 在多個應用程序之間共享機器密鑰

[英]DataProtection - Share machine key between multiple applications

假設我們有兩個 API,一個用於UserManagement ,一個用於Auth

UserManagement API負責初始邀請電子郵件(我需要ResetPasswordToken因為這是我當前的應用程序流程), Auth API負責密碼恢復(我需要ResetPasswordToken )。

當然,我需要為兩個應用程序指定相同的機器密鑰。

我們還假設這兩個應用程序將部署在負載均衡器之后。 2 個應用程序 x 3 個實例。

在兩個 API 中為持久化密鑰(Redis 左右)擁有相同的共享位置就足夠了嗎?

services.AddDataProtection().PersistKeysToRedis(/* */);

我在想,如果它適用於一個應用程序、多個實例場景,它也適用於多個應用程序、多個實例場景。

PS:我找不到任何關於任何鎖定機制的信息(似乎有人只是在看它的行為方式)

我擔心的另一件事是:比賽條件?!

Duc_Thuan_Nguy 2017 年 6 月 9 日

出於好奇,密鑰滾動如何處理並發? 例如,假設我們有一個帶有 2 台機器和一個共享網絡目錄的網絡農場。 可能存在競爭條件,其中兩台機器都希望同時滾動新密鑰。 這種情況如何處理? 或者兩台機器可以滾動自己的新密鑰,只要他們可以訪問兩個新密鑰,就可以順利解除數據保護?

評論參考: https : //docs.microsoft.com/en-us/aspnet/core/security/data-protection/implementation/key-management

稍后編輯:看起來如果您有多個應用程序,則指定您希望將密鑰保留在同一位置是不夠的。 有一個應用程序鑒別器的概念(所有應用程序都被隔離)。

您將需要類似以下內容:

services.AddDataProtection(configure => {
                configure.ApplicationDiscriminator = "App.X";
            }).PersistKeysToRedis(/* */);

鎖定和競爭條件問題仍然有效。

不,這還不夠。 ASP.NET Core 的數據保護默認根據文件路徑或 IIS 托管信息隔離應用程序,因此多個應用程序可以共享一個密鑰環,但仍然無法讀取彼此的數據。

正如文檔所述

默認情況下,數據保護系統會將應用彼此隔離,即使它們共享相同的物理密鑰存儲庫。 這會阻止應用程序了解彼此的受保護負載。 要在兩個應用程序之間共享受保護的有效負載,請為每個應用程序使用具有相同值的 SetApplicationName

public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection()
        .SetApplicationName("shared app name");
}

關於這個的快速更新:似乎可以通過在除“主要”應用程序之外的所有應用程序上使用DisableAutomaticKeyGeneration方法來消除競爭條件。

即它將是

    services.AddDataProtection()
        .SetApplicationName("shared app name");

對於主要的和

    services.AddDataProtection()
        .SetApplicationName("shared app name")
        .DisableAutomaticKeyGeneration();

對於所有其他應用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM