簡體   English   中英

為什么將自定義聲明添加到副本后,原始身份 object 會出現自定義聲明?

[英]Why do custom claims appear in original identity object after I add them to a copy?

在 ASP.NET Core 3.1 項目中,我在用戶登錄后向ClaimsIdentity object 添加了一些自定義聲明。

public void ConfigureServices(IServiceCollection services)
{
   ...
      options.Events.OnTicketReceived = context =>
      {   
          var claimsIdentity = (ClaimsIdentity)context.Principal.Identity;
          // custom claims
          AddCustomClaims(claimsIdentity);

          return;
      };
   ...
}

private void AddCustomClaims(ClaimsIdentity claimsIdentity)
{
    claimsIdentity.AddClaim(new Claim("test1", "helloearth!!!"));
    claimsIdentity.AddClaim(new Claim("test2", "helloplanet!!!"));
    claimsIdentity.AddClaim(new Claim("test3", "helloworld!!!"));
}

如果我在return; 並查看context.Principal.Identity object,所有三個聲明都出現在那里。

我不明白為什么? 我以為我制作了context.Principal.Identity的副本,而AddCustomClaims方法僅操縱了該副本。 但不知何故,原來的 object 受到了影響。

這是變量和引用類型之間由來已久的混淆。

簡單來說,.NET中有兩大類類型,值類型和引用類型。 當您將變量引入混合中時,持有值類型的變量會像數字一樣持有整個值,而持有引用類型的變量只持有對 object 的引用,而 object 在計算機的 ZCD69B4957F06CD818D7BF3D61980E29 的其他地方。

您的.Identity屬性包含這樣的引用,指向引用類型的實例,因此當您這樣做時

var claimsIdentity = (ClaimsIdentity)context.Principal.Identity;

您實際上並沒有復制 object,而是復制了對它的引用。 我喜歡用房屋來解釋這一點。 您的 object 實例是某處的房子,而變量就像帶有該房子地址的便利貼。

你的聲明並沒有建造另一所房子,它只是在上面寫了另一張帶有相同地址的便利貼。

或者在 .NET 術語中,您的變量claimsIdentity現在與.Identity中的引用相同,但它們都引用相同的單個object,位於 memory 中的某處。

因此,當您更改 object 時,您更改了 object。

暫無
暫無

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

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