OWIN Middleware CurrentPrincipal.Identities имеет разные наборы утверждений.

Сегодня я настраивал поставщика авторизации для промежуточного программного обеспечения Oauth и пытался вставить некоторое значение guid в Thread.CurrentPrincipal.Identity.Claims. Но когда я попытался вызвать FindFirst Thread.CurrentPrincipal, у меня ничего не получилось.

Вот пример того, что я пытался сделать:

public override Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
    var claimsIdentity = Thread.CurrentPrincipal.Identity as ClaimsIdentity;

    if (claimsIdentity != null)
       claimsIdentity.AddClaim(new Claim("TestClaim", Guid.NewGuid().ToString()));

    var claimValue = ((ClaimsPrincipal)Thread.CurrentPrincipal)
        .FindFirst(x => x.Type == "TestClaim"); //claimValue == null!
}

Проверка внутренних свойств обнаружила, что Thread.CurrentPrincipal.Identity по-прежнему содержит требование, которое я установил ранее, а Thread.CurrentPrincipal.Identities[0] — нет. Таким образом, есть два разных экземпляра удостоверения с собственным набором утверждений.

Я попытался выполнить те же шаги внутри действия контроллера Web Api, и там Identity ссылался на Identities[0], что означает, что существует тот же экземпляр.

Что происходит с Currentprincipal промежуточного программного обеспечения OWIN, поэтому Identity и Identities[0] относятся к разным экземплярам? Может ли кто-нибудь объяснить мне это, пожалуйста?

Благодарю вас!


person Refraction    schedule 05.08.2014    source источник


Ответы (1)


Я встретил ту же проблему. Я не знаю, почему свойство Identity и первое удостоверение свойства Identities являются разными экземплярами...
Но кажется, что все методы, относящиеся к утверждениям в классе ClaimsPrincipal (Claims, FindFirst...), основаны на свойство Identities, поэтому обновление свойства Identity не имеет никакого эффекта.
Я предпочитаю сохранять согласованность двух удостоверений, поэтому для решения проблемы использую следующий обходной путь:

principal = (ClaimsPrincipal)Thread.CurrentPrincipal
identity = (ClaimsIdentity)user.Identity;
identity1 = user.Identities.First();
identity.AddClaim(claim);
identity1.AddClaim(claim);
person gentiane    schedule 29.10.2015