site logo

Single Sign On, jednotné přihlášení

Webový server, který generuje html stránky pro webovou aplikaci často potřebuje znát identitu uživatele, který si vyžádal webovou stránku. Podle toho připraví seznam objednaného zboží, vybere poštu jen pro správného uživatele a cizím uživatelům zabrání číst vaši poštu. Pro zjištění identity se používají přihlašovací formuláře.

Uvnitř firemní sitě, na intranetu, je možné využít skutečnosti, že uživatel se přihlásil k firemní síti již při startu systému a webový server ve spolupráci s doménovým serverem může zjistit identitu uživatele který žádá intranetovou stránku. Přihlašovací formulář pak může být vynechán. Takovému postupu říkáme Single Sign On, tedy jednotné přihlášení. Práce na intranetu je pak jednodušší, pohodlnější a rychlejší.

Připomínám, že jednotné přihlášení lze použít jen v intranetu, přesněji tam, kde webový server i klienti běží ve stejné doméně a klienti mají platný účet v této doméně a jsou pod tímto účtem přihlášeni. Bez problémů běží v síti Windows. V žádném případě nelze SSO použít na internetu.

Výjímečně lze k ověření identity použít IP adresu zařízení (lze podvrhnout a pozor na DHCP server). Také lze nastavovat přístupová práva k adresářům a souborům webového serveru pro jednotlivé uživatele na úrovni systémového administrátora. Flexibilnější řešení je vytvořit seznam uživatelů a jim přidělených rolí. Podle role aktuálního uživatele pak serverový skript rozhodne zda povolí některé akce, nebo zobrazí citlivá data. Správa tabulky s přihlašovacími jmény uživatelů a jejich rolí je velmi jednoduchá a přehledná.

screenshot konzole IIS, ověření uživatele

Nyní slíbené Single Sign On. Nastavení provádíme na webovém serveru, nikoli na klientovi. Spustíme konzoli IIS, přejdeme na adresář, nebo soubor kterému chceme nastavit zabezpečení a zvolíme Vlastnosti z kontextového menu.

Přejdeme na kartu Zabezpečení adresáře, zde v řádku Nastavení anonymního přístupu a ověřování klikneme na tlačítko Upravit a otevře se další okno Metody ověřování. Zde musí být zatržení jen u položky Integrované ověřování systému Windows (poslední položka, vespod). Na starších systémech byla tato položka taky nazývaná NTLM, nebo taky Chalenge Response.

Při tomto způsobu ověřování si server vyžádá jméno účtu uživatele, který požaduje stránku z webového serveru. Po síti se tedy nepřenáší heslo, jen jméno uživatele v zakódované formě. Protože při přístupu na zabezpečenou stránku probíhá komunikace mezi serverem a klientem v několika přídavných krocích, je odezva vždy pomalejší, než pro stránky, které mají povolen anonymní přístup. Proto popsané nastavení používejte jen pro adresáře, nebo jednotlivé soubory (skripty), kde je nutné skutečně ověřit identitu uživatele.

Pro testování jednotného přihlášení se může hodit následující program, který umístíte na intranetový server do zabezpečeného adresáře a budete jej spouštět z různých PC. Program vypíše všechny serverové proměnné. V proměnné LOGON_USER najdete jméno účtu PC, ze kterého je stránka vyžádána. Pokud je v této proměnné IP adresa, není správně nastaveno zabezpečení adresáře. Pokud volání skončí chybou 401.1, pravděpodobně není toto PC řádně přihlášeno k doméně. Skript je napsán v ASP.Clasic.


<html>
<head>
<title>List Server Variables<title>
<meta http-equiv="Expires" content="0">
</head>

<body>
<p>UserName: <%= Request.ServerVariables("LOGON_USER") %> </p>
<table><th colsp="2">ServerVariables</th><tr>
<%
For Each var in Request.ServerVariables
  Response.Write "<tr><td>" & var & ":</td>"
  Response.Write "<td>" & Request.ServerVariables(var) & "</td></tr>"
Next
%>
</table>
</body>
</body>
</html>

Příklad funkce testování uživatelovy role. Ukázka je ze serverového skriptu s použitím VBScriptu. Každá část aplikace může vyžadovat určitou roli uživatele k provedení akce. Například editování záznamu v databázi vyžadujete roli edit. Funkce Autentic("edit") nám vrátí prázdný řetězec pokud uživatel požadující stránku nemá přiřazenou odpovídající roli, nebo jméno uživatele pokud tuto roli má. Skript podle výsledku funkce rozhodne zda provede / neprovede zápis do databáze, nebo zobrazí / nezobrazí formulář, tabulku ap.

Databázová tabulka (PCuser) udržuje seznam uživatelů, kteří mají přiřazenou nějakou roli. Jeden uživatel může mít přiřazeno více rolí, naopak pasivní uživatel, který má práva pouze číst data nemusí být vůbec uveden v seznamu.


FUNCTION Autentic(ByVal reqRole)
  ' === LOGON_USER je jmeno uzivatele. Najdeme jemu prirazenou
  ' === roli v databazi a porovname ji s pozadovanou roli.
  Dim dbRole, userName
  Autentic = ""
  reqRole  = UCase(reqRole) ' === prevod na velka pismena
  userName = UCase(Request.ServerVariables("LOGON_USER"))
  userName = Mid(userName, InStrRev(userName, "\")+1) ' === jen jmeno
  If userName <> "" Then
    query  = "SELECT * FROM  PCuser WHERE name='" & userName & "'"
    Set Rf = Conn.Execute(query)
    If Not Rf.BOF  Then
      dbRole = UCase(Rf("role"))
      If (InStr(dbRole, reqRole) < 0) Then
        Autentic = userName
      End If
    End If
    Rf.close
  End If
END FUNCTION

Uživatel při prvním přístupu ke stránce, která vyžaduje ověření uživatele pomocí SSO je požádán aby vyplnil přihlašovací formulář. Použije se stejné jméno a heslo jako při startu systému. Opakovaný přístup na takto zabezpečené stránky již jméno a heslo nevyžaduje a uživatel je ověřen automaticky. Po dlouhé přestávce v používaní intranetu je někdy nutné zadání jména a hesla zopakovat.

Jak se chovají browsery k této MS technologii? Jistě nás nepřekvapí bezešvá integrace do IE, podrobnější nastavení browseru IE najdete zde. FireFox jednotné přihlášení také podporuje, ale je vhodnější nastavit adresu intranetového serveru do konfigurace browseru. V adresním řádku Firefoxu zadáme about:config, najdeme položku ..-ntlm-.. a vyplníme podle následujícího obrázku. intranet je jméno Vašeho intranetového serveru, localhost použijte jen na Vaší vývojové stanici. Chrome nevyžaduje žádné specifické nastavení a SSO funguje bez problémů.

nastavení SSO ve FireFoxu

Opera od verze 9 podporuje ověření uživatele, ale vždy po startu browseru a prvním přístupu na stránku vyžadující SSO je nutné znovu se přihlásit pomocí formuláře. Pak až do zavření Opery vše funguje bez problémů. Toto však není skutečné jednotné přihlášení. Uživatel by měl zadávat heslo jen jednou a to při startu systému.

Problémy může způsobit politika nastavená na automatické vypršení délky platnosti hesla. Pokud PC běží v nepřetržitém provozu a výzva ke změně hesla je ignorována, SSO přestane fungovat.

updated 2012-02-13