Windows Identity Foundation (WIF) v .NET 4.5

Jan Holan       9. 8. 2012       .NET, WIF       7612 zobrazení

S příchodem .NET Frameworku 4.5 vyjde i nová verze technologie Windows Identity Foundation (WIF). Zatímco verze WIF 1.0 je k dispozici jako samostatný instalační balíček, který obsahuje assembly Microsoft.IdentityModel.dll pro .NET 3.5 nebo 4.0, verze WIF 4.5 je nyní kompletně integrována do .NET Frameworku 4.5. Koukneme se na rozdíly v architektuře a v API.

Třídy Principal, Identity

Největší změna se týká tříd Principal a Identity. Dříve třídy GenericPrincipal, WindowsPrincipal a RolePrincipal dědily pouze ze základního interface IPrincipal. WIF 1.0 přinesl nový interface IClaimsPrincipal a z něho odvozené třídy WindowsClaimsPrincipal, ClaimsPrincipal. Podobně je to i s třídy Identity, které dědí z IIdentity, WIF doplňuje IClaimsIdentity a třídy WindowsClaimsIdentity a ClaimsIdentity.

ClaimsPrincipal_Before

V .NET Frameworku 4.5 třídy GenericPrincipal, WindowsPrincipal a RolePrincipal dědí přímo z třídy ClaimsPrincipal , která je navíc již v základní knihovně mscorlib (namespace System.Security.Claims). Každý principal je tedy ClaimsPrincipal. Obdobně třídy GenericIdentity , WindowsIdentity a FormsIdentity dědí z ClaimsIdentity. Interface IClaimsPrincipal ani IClaimsIdentity již nejsou potřeba, a tak byly zrušeny.

ClaimsPrincipal

Změny API

Díky této velice pěkné změně v architektuře, máme WIF API obou verzí rozdílné. Třídy z assembly Microsoft.IdentityModel.dll nám nyní přechází do assembly mscorlib.dll, System.IdentityModel.dll a nové System.IdentityModel.Services.dll.

Zde jsou některé příklady umístění tříd v původních a nových namespace:

Třídy: Claim, ClaimsPrincipal, ClaimsIdentity, ClaimTypes, ClaimsAuthenticationManager, ClaimsAuthorizationManager a další
Původní namespace: Microsoft.IdentityModel.Claims
Nový namespace: System.Security.Claims (mscorlib.dll)

Třídy: SecurityTokenHandler, SecurityTokenHandlerCollection, SessionSecurityToken, SessionSecurityTokenHandler, WindowsUserNameSecurityTokenHandler a další
Původní namespace: Microsoft.IdentityModel.Tokens
Nový namespace: System.IdentityModel.Tokens (System.IdentityModel.dll)

Třídy: SecurityTokenService a další
Původní namespace: Microsoft.IdentityModel.SecurityTokenService
Nový namespace: System.IdentityModel (System.IdentityModel.dll)

Třídy: WSFederationAuthenticationModule, SessionAuthenticationModule, FederatedAuthentication, CookieHandler a další.
Původní namespace: Microsoft.IdentityModel.Web
Nový namespace: System.IdentityModel.Services (System.IdentityModel.Services.dll)

Mezi další zajímavé změny API patří:

  • Vlastnost Current na třídě ClaimsPrincipal.
  • Vlastnost Claims na třídě ClaimsPrincipal pro získání kolekce claimů ze všech identit.
  • Metody FindFirst, FindAll, HasClaim tříd ClaimsPrincipal a ClaimsIdentity.
  • Vlastnosti UserClaims a DeviceClaims na třídě WindowsPrincipal pro podporu Windows Server 2012 domain functional level

Příklady kódů

Podíváme se na některé příklady kódů před převodem a po převodu do WIF 4.5. (Vybral jsme některé kódy z příkladů ze článků Windows Identity Foundation: Náhrada za Forms autentizacia ASP.NET FileAccessWeb Sample, část 2: Login

Načtení hodnoty konkrétního claimu.
WIF 1.0:

var claimsIdentity = (IClaimsIdentity)Page.User.Identity;

string email = (from claim in claimsIdentity.Claims
                where claim.ClaimType == ClaimTypes.Email
                select claim.Value).First();

WIF 4.5:

string email = ClaimsPrincipal.Current.FindFirst(ClaimTypes.Email).Value;

Ověření uživatele pomoci FederatedAuthentication.
WIF 1.0:

SecurityToken securityToken = new UserNameSecurityToken(userName, password);
var handlers = FederatedAuthentication.ServiceConfiguration.SecurityTokenHandlers;

var principal = ClaimsPrincipal.CreateFromIdentities(handlers.ValidateToken(securityToken));
return (WindowsClaimsPrincipal)principal;

WIF 4.5:

SecurityToken securityToken = new UserNameSecurityToken(userName, password);
var handlers = FederatedAuthentication.FederationConfiguration.IdentityConfiguration.SecurityTokenHandlers;

return new WindowsPrincipal((WindowsIdentity)handlers.ValidateToken(securityToken)[0]);

Vrácení ClaimsPrincipal a ClaimsIdentity s vlastními claimy.
WIF 1.0:

var inputIdentity = principal.Identity;

var outputIdentity = new ClaimsIdentity(inputIdentity.AuthenticationType);
outputIdentity.Claims.Add(new Claim(ClaimTypes.Name, inputIdentity.Name));
outputIdentity.Claims.Add(new Claim("DisplayName", displayName));

return ClaimsPrincipal.CreateFromIdentity(outputIdentity);

WIF 4.5:

var inputIdentity = principal.Identity;

var outputIdentity = new ClaimsIdentity(inputIdentity.AuthenticationType);
outputIdentity.AddClaim(new Claim(ClaimTypes.Name, inputIdentity.Name));
outputIdentity.AddClaim(new Claim("DisplayName", displayName));

return new ClaimsPrincipal(outputIdentity);

Konfigurace

Rozdíly jsou také v konfiguraci. Ta je nyní rozdělena do dvou nových elementů identityConfiguration a federationConfiguration:

WIFConfigurationElements

Další novinkou jsou nové elementy pro podporu Webových farm.

V souboru Web.config pak nová konfigurace vypadá takto:

Deklarace konfigurační sekce
WIF 1.0:

<configSections>
  <section name="microsoft.identityModel" type="Microsoft.IdentityModel.Configuration.MicrosoftIdentityModelSection, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</configSections>

WIF 4.5:

<configSections>
  <section name="system.identityModel" type="System.IdentityModel.Configuration.SystemIdentityModelSection, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
  <section name="system.identityModel.services" type="System.IdentityModel.Services.Configuration.SystemIdentityModelServicesSection, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</configSections>

Deklarace modulů
WIF 1.0:

<modules>
  <add name="SessionAuthenticationModule" type="Microsoft.IdentityModel.Web.SessionAuthenticationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="managedHandler"/>
  <add name="WSFederationAuthenticationModule" type="Microsoft.IdentityModel.Web.WSFederationAuthenticationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="managedHandler" />
</modules>

WIF 4.5:

<modules>
  <add name="SessionAuthenticationModule" type="System.IdentityModel.Services.SessionAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="managedHandler" />
  <add name="WSFederationAuthenticationModule" type="System.IdentityModel.Services.WSFederationAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="managedHandler" />
</modules>

Příklad konfigurace
WIF 1.0:

<microsoft.identityModel>
  <service>
    <securityTokenHandlers>
      <remove type="Microsoft.IdentityModel.Tokens.SessionSecurityTokenHandler, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
      <add type="Microsoft.IdentityModel.Tokens.SessionSecurityTokenHandler, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
        <sessionTokenRequirement lifetime="60.00:00:00" />
      </add>
    </securityTokenHandlers>

    <audienceUris>
      <add value="http://localhost/WebApplication/" />
    </audienceUris>

    <issuerNameRegistry type="Microsoft.IdentityModel.Tokens.ConfigurationBasedIssuerNameRegistry, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
      <trustedIssuers>
        <add thumbprint="9B74CB2F320F7AAFC156E1252270B1DC01EF40D0" name="LocalSTS" />
      </trustedIssuers>
    </issuerNameRegistry>
    <certificateValidation certificateValidationMode="None" />    

    <federatedAuthentication>
      <cookieHandler requireSsl="false" />
      <wsFederation passiveRedirectEnabled="true" issuer="http://localhost:15661/wsFederationSTS/Issue" realm="http://localhost/WebApplication/" reply="http://localhost/WebApplication" requireHttps="false" />
    </federatedAuthentication>    
  </service>
</microsoft.identityModel>

WIF 4.5:

<system.identityModel>
  <identityConfiguration>
    <securityTokenHandlers>
      <remove type="System.IdentityModel.Tokens.SessionSecurityTokenHandler, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      <add type="System.IdentityModel.Tokens.SessionSecurityTokenHandler, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
        <sessionTokenRequirement lifetime="60.00:00:00"/>
      </add>
    </securityTokenHandlers>
    
    <audienceUris>
      <add value="http://localhost/WebApplication/" />
    </audienceUris>
    
    <issuerNameRegistry type="System.IdentityModel.Tokens.ConfigurationBasedIssuerNameRegistry, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <trustedIssuers>
        <add thumbprint="9B74CB2F320F7AAFC156E1252270B1DC01EF40D0" name="LocalSTS" />
      </trustedIssuers>
    </issuerNameRegistry>
    <certificateValidation certificateValidationMode="None" />
  </identityConfiguration>
</system.identityModel>

<system.identityModel.services>
  <federationConfiguration>
    <cookieHandler requireSsl="false" />
    <wsFederation passiveRedirectEnabled="true" issuer="http://localhost:15661/wsFederationSTS/Issue" realm="http://localhost/WebApplication/" reply="http://localhost/WebApplication" requireHttps="false" />
  </federationConfiguration>
</system.identityModel.services>

WIF 4.5 SDK

Mezi další novinky WIF 4.5 patří jeho nové SDK, jedná se o doplněk do Visual Studia 2012 dostupný na VS Gallery, jmenuje se Identity and Access Tool.

Ve VS je pak pod přidanou volbou Identity and Access průvodce, který je kompletně přepracovaný a je nyní zaměřený pro vývojáře (předchozí konfigurační utilita Fedudil.exe byla spíše pro administrátory). Průvodce umí konfigurovat aplikaci pro zvolený Security Token Service (STS), podporované jsou Local development STS – umožňuje spuštění lokálního vývojového STS, ADFS2 a cloudový Access Control Service (ACS) 2.0. Konfiguraci lze nově také v průvodci editovat.

Další novinkou jsou přepracované nebo nové Samples a Templates Claims Aware aplikací, které jsou dostupné přímo ve Visual Studiu.

Windows 8

A poslední novinky se týkají Windows 8. Kromě WIF 4.5 je zde v případě potřeby dostupný i WIF 1.0 runtime v podobě Windows Feature (více zde).

WIF_Windows Feature

Pro další informace o WIF 4.5 také doporučuji tuto prezentaci z letošního TechEdu:
Vittorio Bertocci - What's New in Windows Identity Foundation in Microsoft .NET Framework 4.5


Pro porovnání na konkrétní aplikaci jsem přepsal nedávno uvedený příklad FileAccessWeb do .NET Frameworku 4.5, zdrojové soubory jsou dostupné zde.

 

hodnocení článku

1 bodů / 2 hlasů       Hodnotit mohou jen registrované uživatelé.

 

Nový příspěvek

 

                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.

Nyní zakládáte pod článkem nové diskusní vlákno.
Pokud chcete reagovat na jiný příspěvek, klikněte na tlačítko "Odpovědět" u některého diskusního příspěvku.

Nyní odpovídáte na příspěvek pod článkem. Nebo chcete raději založit nové vlákno?

 

  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback