site logo

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

Ověření identity uživatele patří k základním úkolům každého intranetu. Podle identity můžeme povolit, nebo zakázat příslušné akce jako zobrazení citlivých dat, zápisy do databáze ap. Nastavování přístupových práv k adresářům a souborům pro jednotlivé uživatele na úrovni systémového administrátora je pro intranetové aplikace nevhodné a komplikované.

Flexibilnější řešení je vytvořit seznam požadovaných rolí (podle charakteru aplikace) a v různých místech aplikace testovat, zda uživatel má přiřazenu požadovanou roli. Seznam uživatelů a jejich rolí udržujeme v tabulce a podle identity aktuálního uživatele můžeme kdykoli testovat zda povolíme určitou aktivitu. Správa takové tabulky je velmi jednoduchá a přehledná.

K ověření identity můžete použít IP adresy (lze lehce podvrhnout), nebo na nebohou uživatelku vybafnout přihlašovací formulář. Osvědčilo se mi jednotné přihlášení (Single Sign On) využívající přihlášení k doméně provedené při startu PC.

Je zajímavé, že cizokrajní top manažeři přihlašovací formuláře považují za důkaz bezpečnosti programu. Takový Lotus Notes, který po každém spuštění vyžaduje znovu heslo (tedy v době když už běží Vaše spywary a keylogery) je bezpečnější než Outlook, který využívá jednotné přihlášení.

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. V žádném případě nelze SSO použít na internetu.

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 pod kterým je PC ze kterého voláte stránku přihlášen. 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

Jak se chovají browsery k této MS technologii. Jistě nás nepřekvapí bezešvá integrace do IE. FireFox sice jednotné přihlášení podporuje, ale při prvním přístupu ke stránce vyžadující ověření uživatele, FF bude vyžadovat přihlašovací formulář. Tomu lze předejít změnou nastavení FF browseru. Do adresového řádku zapíšeme 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. FireFox a IE se pak budou chovat při jednotném přihlášení stejně.

nastavení SSO ve FireFoxu

Opera od verze 9 již podporuje ověření uživatele, ale podobně jako FF po startu browseru a prvním přístupu na stránku vyžadující ověření je nutné přihlásit se pomocí formuláře. Pak až do zavření Opery vše funguje bez problémů. Nastavení podobné tomu v FF jsem ale nenašel. Toto však není skutečné jednotné přihlášení. Uživatel by měl zadávat heslo jen při startu systému, v době kdy ještě neběží jeho spyware.

updated 26.03.2006