CurrentPrincipal.Identities на OWIN Middleware имат различен набор от претенции

Днес конфигурирах доставчик на оторизация за 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, така че неговата идентичност и самоличностите [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