Kontakt: Rebex ČR s.r.o., Bělehradská 77, 120 00 Praha 2, tel. 222 727 315,  info@rebex.czwww.rebex.cz 
HOME [www.rebex.cz]

ASP: Jak zjistit členství uživatele v NTéčkové skupině.

Kvůli personalizaci stránek nebo kvůli nastavené přístupových práv v Intranetu se často hodí zjistit, jestli je uživatel připojený k webu členem určité skupiny. Poradíme jak na to s pomocí ADSI a ASP.

(Martin Vobr, publikováno ve Světě Namodro)

Při tvorbě webových aplikací se často naráží na nutnost personalizace stránek. Zvlášť žhavé je to v intranetech - je zřejmé, že například vedoucí potřebuje vidět v intranetu jiné věci než prodejce a ten zase jiné než technická podpora. Existuje samozřejmě velká spousta možností, jak stránky upravit pro jednotlivé uživatele, většina z nich ale vyžaduje napsání separátních nástrojů na správu přístupových práv.

Proč ale pro účel personalizace nepoužít účty z NT serveru? Skupiny a uživatelé kteří do nich patří se editují snadno (přes WinNT UserManager), skupiny jsou většinou už stejně vytvořené (například pro rozlišení přístupu k souborům na serveru), a uživatele který přistupuje na web také snadno zjistíme (když se zapne NTLM autentikace) - takže se zdá že cesta tímto směrem je otevřená. Přístupová práva k jednotlivým stránkám, a/nebo  personalizaci jejich obsahu budeme určovat podle příslušnosti uživatele ke skupině založené ve Windows NT.

Takový přístup je lákavý, ale má jeden háček. Jak zjistit jestli je uživatel členem určité skupiny? V ASPéčkách na to přímo žádná funkce není. Na webu existutují různé COM objekty, které takovou funkcionalitu poskytují (například NTAccess.Groups), ty ale mají dvě nevýhody:

  1. musí se za ně platit
  2. musí se na serveru registrovat (jasně, v Intranetu máme nad serverem kontrolu, ale u providera většinou ne)

Naštěstí se dá použít ADSI. ADSI (Active Directory Services Interface) je rozhraní k adresářové službě - dá se použít například k administraci IIS a velice snadno se skriptuje jak z WSH tak z ASPéček. Naštěstí nemusíme čekat na Windows 2000, které jsou ADS a ADSI prorostlé, část funkcí funguje už Windows NT 4.

Pokud například chceme zjistit (jak je uvedeno výše) to, zda je uživatel členem určité skupiny stačí otevřít objekt "WinNT://domena/skupina" a zavolat metodu IsMember.

Na konci tohoto článku je funkce IsGroupMember, která zapouzdřuje zjišťování členství uživatele ve skupině. Použití je snadné:

<%
  dim strDomain
  dim strGroup
  dim strUser
  dim strTemp
  ' zjisti login uzivatele - pri NTLM autentikaci 
  ' neco jako "DOMENA\UZIVATEL"
  strTemp = request.servervariables("LOGON_USER")
  ' rozparsuj jmeno uzivatele a jmeno domeny
  strUser = mid(strTemp, InStr(strTemp,"\")+1)
  strDomain = left(strTemp, InStr(strTemp,"\")-1)
  ' tuto skupinu testujeme
  strGroup = "domain admins"
  Response.write IsGroupMember & _
  (strDomain,strGroup,strUser) & "<br>"
  if IsGroupMember(strDomain,"marketing",strUser)_
  then

    .... kod pro prodejce
  end if

  if IsGroupMember (strDomain,"vedeni", strUser)_
  then
    ... kod pro vedeni 
  end if
    ....
%>

A vlastní funkce:

<%
'@bfunc vraci Zjisti jestli je uzivatel clenem 
' urcite globalni skupiny
'@bparm nazev domeny (napriklad "office")
'@bparm nazev skupiny ("napriklad "administrators")
'@bparm login uzivateke (napriklad "hugo")
'@bret True pokud je clenem skupiny,
'      False pokud neni
public function _
       IsGroupMember(strDomain,strGroup,strUser)

  dim dsObj	
  on error resume next

  ' vezmi ADSI objekt se skupinou	
  set dsObj = getObject ("WinNT://" & strDomain _
              & "/" & strGroup)
  ' pri chybe bez pryc
  if err <> 0 then 
    IsGroupMember = false 
    Exit function
  end if
	
  if dsObj.IsMember("WinNT://" & strDomain & _
  "/" & strUser) then
  
    IsGroupMember = true
  
  else
  
    IsGroupMember = false
  
  end if

  ' pri chybe bez pryc
  if err <> 0 then 
    IsGroupMember = false 
    Exit function
  end if
end function
%>
(c) 2008 REBEX ČR s.r.o., Bělehradská 77, 120 00 Praha 2, tel. 222 727 315
info@rebex.cz  www.rebex.cz  weblog.rebex.cz  www.rebex.net  blog.rebex.net 
Komponenty pro .NET/.NET CF: FTP, SFTP, FTPS, SMTP/SSL, POP3/SSL, IMAP/SSL, S/MIME, Telnet SSH Shell NTP ZIP