U ovom primjeru koristi se OIOSAML.NET programski alat za implementaciju SAML2 protokola u .NET web aplikacijama. Ovaj programski alat inicijalno je nastao na temelju projekta Danske vlade za integracijom vladinih servisa u sustav jedinstvene autentikacije, a u sustavu AAI@EduHr koristi se kao autentikacijski modul za povezivanje .NET aplikacija s AAI@EduHr Single Sign-On servisom.
Potrebna programska podrška
Upute u nastavku realizirane su uporabom sljedeće programske podrške:
- Microsoft Windows Server 2008 R2 SP1 / Windows 7 Professional;
- IIS sa ASP.NET 2.0 modom rada;
- .NET 4.5 framework ili noviji;
- Microsoft Visual Studio 2005 ili noviji;
- Potrebno je instalirati
OIOSAML.NET
, verziju 1.7.9 (direktna poveznica na dk.nita.saml20 nuget paket); - Odgovarajuća DLL datoteka
dk.nita.saml20.dll
prilagođena sustavu AAI@EduHr; - Datoteka
log4net.dll
- log4net omogućuje napredno logiranje događaja, koje možemo i ne moramo konfigurirati ovisno o tome želimo ili ne dodatno logiranje, ali ova komponenta mora postojati; - Windows distribucija OpenSSL-a za generiranje certifikata;
Procedura za implementaciju OIOSAML autentikacijskog modula
1. Pokrenite Visual Studio
i kreirajte novi ASP.NET
projekt:
File -> New -> Web Site...
2. Instalirajte dk.nita.saml20 nuget paket.
3. Dodajte prilagođenu datoteku dk.nita.saml20.dll
(preuzetu sa ovih uputa) u projekt:
Projekt -> Add Existing Item...
Odaberite datoteku dk.nita.saml20.dll.
4. Dodajte poveznicu na datoteku dk.nita.saml20.dll
:
- Uklonite referencu na postojeći DLL dk.nita.saml20.dll koji je došao sa instalacijom paketa
- Dodajte referencu na prilagođeni DLL:
Projekt -> Add Reference...
Odaberite datoteku dk.nita.saml20.dll.
5. Dodajte ASP.NET handlere login.ashx, logout.ashx i metadata.ashx:
Projekt -> Add New Item...
Iz ponuđenog prozora odaberite Generic Handler
i upišite ime datoteke login.ashx
Ponovite postupak za preostala 2 handlera: logout.ashx
i metadata.ashx
.
6. Promjenite sadržaje generičkih handlera na sljedeći način (svaki postojeći kod handlera treba zakomentirati ili obrisati):
U login.ashx
postaviti:
<%@ WebHandler Class="dk.nita.saml20.protocol.Saml20SignonHandler" %>
U logout.ashx
postaviti:
<%@ WebHandler Class="dk.nita.saml20.protocol.Saml20LogoutHandler" %>
U metadata.ashx
postaviti:
<%@ WebHandler Class="dk.nita.saml20.protocol.Saml20MetadataHandler" %>
7. Instalirajte certifikat (postupak generiranja certifikata) kojim će se potpisivati zaglavlje. Certifikat treba instalirati u Computer Account
koristeći MMC Certificates.
8. Odaberite certifikat i postavite prava čitanja za Network Service
i IIS_IUSR
9. Koristite prilagođenu konfiguracijsku web.config
datoteku:
Preuzmite datoteku i preimenujte je iz web.config.example u web.config. U web.config
datoteci pronađite redak:
<SigningCertificate findValue="CN=virtualni-host, DC=organization, DC=hr" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectDistinguishedName" validonly="no"/>
Zamjenite sadržaj atributa findValue
vrijednošću atributa Subject
u certifikatu kojim će se potpisivati zaglavlja (kriterij pretraživanja MS Certificate Store-a putem DN). Navedeno se može pronaći dvostrukim klikom na certifikat te pregledom polja Subject
(slika je samo za primjer):
Dalje, u web.config
datoteci pronađite redak:
<ServiceProvider id="demoSP" server="http://virtualni-host/">
Zamjenite id
imenom kojim će se vaša aplikacija predstavljati Single Sign-On servisu, dok server
treba biti stvarno ime poslužitelja.
Dalje, u web.config
datoteci pronađite redak:
<Audience>demoSP<Audience>
U vrijednost Audience
upišite istu vrijednost koja je upisana u polje id
u prethodnom koraku.
10. U korijenu c:\
kreirajte direktorij metadata
i postavite mu prava čitanja za Network Service
i IIS_IUSR
. Ukoliko direktorij metadata
treba biti na nekom drugom mjestu, u konfiguracijskoj datoteci web.config
treba promjeniti putanju do direktorija:
<IDPEndPoints metadata="C:\metadata\"> <add id="https://login.aaiedu.hr/ms/saml2/idp/metadata.php"> <CertificateValidation> <add type="dk.nita.saml20.Specification.SelfIssuedCertificateSpecification, dk.nita.saml20"/> </CertificateValidation> </add> </IDPEndPoints>
11. Dohvatite metapodatke AAI@EduHr Single Sign-On servisa i spremite ih u gore definiran direktorij metadata
pod bilo kojim imenom (npr. aaiedu_metadata.xml
). U slučaju testiranja autentikacije u testnom AAI@EduHr okruženju, potrebno je dohvatiti metapodatke za AAI@EduHr Lab Single Sign-On servis. U tom slučaju, prilikom prelaska u produkciju, potrebno je zamjeniti testne metapodatke sa produkcijskim.
12. Objavite kompajliran projekt na web serveru.
13. Registrirajte vašu aplikaciju u sustavu AAI@EduHr prema uputama na web stranici Registar resursa.
SAML metapodatke koje je potrebno unijeti prilikom registracije možete pronaći na web adresi (URL) na kojoj se nalazi metadata handler vaše aplikacije, npr. https://vas_posluzitelj.ustanova.hr/metadata.ashx.
SAML modul resursa koji koriste OIOSAML.NET u registru resursa treba u parametru AuthService imati postavljenu vrijednost OIOSAML.NET.
14. (opcionalno) Prema početnim postavkama, OIOSAML.NET paket za sve tipove grešaka javlja generičku poruku tipa 'Unable to validate SAML message'. Tijekom razvoja i testiranja aplikacije moguće je uključiti detaljni prikaz poruke greške na način da se postavi konfiguracija 'ShowError'. Ovu opciju potrebno je onemoućiti u produkciji.
<SAML20Federation xmlns="urn:dk.nita.saml20.configuration"> ... <ShowError>true</ShowError> ... </SAML20Federation>
Generiranje certifikata
Postupak generiranja certifikata (potrebna je OpenSSL
distribucija za Windowse):
1. Generirajte 1024 bitni ključ:
openssl genrsa -out openssl_key.pem 1024
2. Generirajte certifikat sljedećom naredbom (sve u jednom retku, zamjenite serverName.realm stvarnim DNS nazivom vašeg poslužitelja):
openssl req -new -x509 -key openssl_key.pem -out openssl_crt.pem -outform pem -days 3650 -subj "/CN=serverName.realm"
3. Snimite certifikat u pk12 formatu, zajedno s privatnim ključem:
openssl pkcs12 -export -in openssl_crt.pem -inkey openssl_key.pem -out certificate_in_pk12.p12
Zapisivanje događaja
dk.nita.saml20
omogućuje zapisivanje događaja na dvije osnovne razine:
Error
- zapisuje samo pogreške;Information
- zapisuje događaje unutar sustava i služi za analizu ponašanja sustava u najsitnije detalje;
Podrazumijevana konfiguracija zapisuje samo pogreške u C:\logs\saml2.trace.log
. Kako direktorij C:\logs
standardno ne postoji, potrebno ga je kreirati i postaviti prava pisanja za Network Service
.
Vrstu zapisivanja događaja i odredišni direktorij moguće je promjeniti u datoteci web.config
u odjeljku diagnostics:
<system.diagnostics> <trace autoflush="true"></trace> <sources> <source name="dk.nita.saml20" switchValue="Error"> <listeners> <add name="trace"/> </listeners> </source> </sources> <sharedListeners> <add name="trace" type="System.Diagnostics.XmlWriterTraceListener" initializeData="C:\logs\saml2.tracelog"/> </sharedListeners> </system.diagnostics>
Uporaba
Podaci o autenticiranom korisniku dohvaćaju se korištenjem property-ja dk.nita.saml20.identity.Saml20Identity.Current
, primjerice:
using dk.nita.saml20.identity; ... if (Saml20Identity.Current != null) { Saml20Identity test = Saml20Identity.Current; Response.Write("Ispisujem vrijednost za hrEduPersonUniqueID: "); string[] values_ID = test["hrEduPersonUniqueID"][0].AttributeValue; Response.Write(values_ID[0]); Response.Write("<br>"); Response.Write("Ispisujem vrijednost za mail: "); string[] values_mail = test["mail"][0].AttributeValue; Response.Write(values_mail[0]); Response.Write("<br>"); Response.Write("Ispisujem vrijednost za hrEduPersonPrimaryAffiliation: "); string[] values_hrEduPersonPrimaryAffiliation = test["hrEduPersonPrimaryAffiliation"][0].AttributeValue; Response.Write(values_hrEduPersonPrimaryAffiliation[0]); Response.Write("<br> <p size=20>it works</p>"); } else { Response.Write("Neautenticirani korisnik"); Response.Redirect("login.ashx"); }
Alternativno, može se koristiti metoda IsInitialized(). Za provjeru postojanja atributa može se iskoristiti metoda HasAttribute().
if (Saml20Identity.IsInitialized()) { string userInfo = "Korisnik je autenticiran. "; Saml20Identity user = Saml20Identity.Current; if (user.HasAttribute("hrEduPersonUniqueID")) { userInfo += "Korisnička oznaka: "; userInfo += user["hrEduPersonUniqueID"][0].AttributeValue[0]; } else { userInfo += "Korisnička oznaka nije među atributima. "; } } ... // Dodatni primjer redirekcije u slučaju da korisnik nije autenticiran. if (! Saml20Identity.IsInitialized()) { Response.Redirect("login.ashx"); }
Korisnik se odjavljuje sa sustava pozivanjem logout.ashx
:
Response.Redirect("logout.ashx");
Redirekcija na stranicu različitu od default.aspx
se postiže uporabom koda:
if (dk.nita.saml20.identity.Saml20Identity.Current == null) { dk.nita.saml20.config.SAML20FederationConfig.GetConfig().ServiceProvider.SignOnEndpoint.RedirectUrl = "subweb.aspx"; dk.nita.saml20.config.SAML20FederationConfig.GetConfig().ServiceProvider.SignOnEndpoint.endpointType = EndpointType.SIGNON; Response.Redirect("login.ashx"); }
Tipične greške
Stack Trace: [CryptographicException: Keyset does not exist ... ]
U tom slučaju certifikat ne sadrži potrebni privatni ključ za generiranje potpisa ili nisu dobro postavljena prava za čitanje. Ponovite korak 7 ili ponovite postupak generiranja certifikata.
Error: dk.nita.saml20.Profiles.DKSaml20.DKSaml20FormatException: The DK-SAML 2.0 profile requires that an attribute's "Name" is an URI.
Format atributa 'Name' kojeg isporučuje AAI@EduHr je 'urn:oasis:names:tc:SAML:2.0:attrname-format:basic'. Prema početnim postavkama, OIOSAML.NET 1.7.9 očekuje format 'urn:oasis:names:tc:SAML:2.0:attrname-format:uri'. U DLL datoteci 'dk.nita.saml20.dll' koja je dostupna za preuzimanje u ovim uputama, napravljene su preinake koje omogućuju ispravnu validaciju SAML odgovora. Provjerite jeste li u vašem projektu uspješno postavili poveznicu (referencu) na prilagođeni DLL koji je dostupan u ovim uputama.
System.Security.Cryptography.CryptographicException: Invalida algorithm specified.
Za rješavanje ove greške, prilikom postupka generiranja certifikata, u zadnjem (trećem) koraku unesite sljedeću naredbu (u naredbi je dodan parametar -CSP):
openssl pkcs12 -export -in openssl_crt.pem -inkey openssl_key.pem -out certificate_in_pk12.p12 -CSP "Microsoft Enhanced RSA and AES Cryptographic Provider"
Nakon toga ponovno instalirajte certifikat i postavite prava čitanja.
dk.nita.saml20Exception: Your sesion has been disconected, please logon again...
Radi se o promjeni ponašanja Internet preglednika vezano za atribut 'SameSite' u kolačićima. Slijedite rješenje za .NET aplikacije.
Važno!
SAML modul resursa koji koriste OIOSAML.NET u registru resursa treba u parametru AuthService imati postavljenu vrijednost OIOSAML.NET.