[英]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.