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.
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.
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:
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).
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.