1
Technologie internetowe
Wykład 12
Kontrola dostępu w ASP.NET
Podstawowe pojęcia
Autentykacja – proces rozpoznania i
uwierzytelnienia użytkownika
Autoryzacja – proces sprawdzenia, czy
rozpoznany użytkownik ma uprawnienia
do wykonywania określonych operacji,
dostępu zasobów
2
Implementacja uwierzytelnienia na
zmiennych sesyjnych
protected void btnLoguj_Click(object sender, EventArgs e)
{
SqlConnection polaczenie =
new SqlConnection(WebConfigurationManager.ConnectionStrings["bazaUzytkownikow"].ConnectionString);
SqlCommand polecenie =
new SqlCommand("SELECT COUNT(*) FROM Uzytkownicy WHERE Nazwa=@Nazwa AND Haslo=@Haslo", polaczenie);
polecenie.Parameters.Add("@Nazwa", SqlDbType.NVarChar, 20).Value = txtNazwa.Text;
polecenie.Parameters.Add("@Haslo", SqlDbType.NVarChar, 20).Value = txtHaslo.Text;
polaczenie.Open();
int ile = (int)polecenie.ExecuteScalar();
if (ile > 0)
Session["uzytkownik"] = "Slawek";
Response.Redirect(Server.UrlDecode(Request.QueryString.ToString()));
else lblInfo.Text = "Zła nazwa użytkownika lub hasło";
}
Logowanie.aspx
protected void Page_PreInit(object sender, EventArgs e)
{
if (Session["uzytkownik"] == null)
{
Response.Redirect("Logowanie.aspx?" + Server.UrlEncode(Request.Url.ToString()));
Response.End();
}
}
Strona chroniona
Metody uwierzytelnienia w ASP.NET
Windows
Wykorzystuje mechanizmy uwierzytelnienia MS Windows
Zarządzanie użytkownikami w ramach narzędzi
administracyjnych Windows
Stosowana dla ograniczonej puli użytkowników
Form
Użytkownicy składowani w dedykowanej bazie danych
Dane uwierzytelniające przekazywane przez formularz HTML
Zarządzanie użytkownikami poprzez strony WWW
Stosowana dla nieograniczonej puli użytkowników
Password
Pula użytkowników wspólna dla wielu serwisów
Dane użytkowników składowane na serwerze MS
3
Uwierzytelnienie Windows
Basic – hasło i login przesyłane w
nagłówku HTTP
Digest – hasło hashowane
NTLM, Kerberos
Certyfikaty klienta
Uwierzytelnienie Forms
Autentykacja przez wpisanie login i hasła
w formularzu umiewszonym na stronie
Zalecane wykorzystanie protokołu SSL
Użytkownicy przechowywani w:
Bazie danych
Pliku XML
Innym składowisku danych
4
Konfiguracja uwierzytelnienia Forms
<system.web>
<authentication mode="Forms">
<forms loginUrl="~/Logowanie.aspx" />
</authentication>
<authorization>
<deny users="Jacek,Placek" />
<deny users="?"/>
</authorization>
</system.web>
<system.web>
<authorization>
<allow users="Administrator"/>
<deny users="*"/>
</authorization>
</system.web>
•- wszyscy uwierzytelnieni i anonimowi
użytkownicy
? - użytkownicy anonimowi
Uwaga ! O pierwszeństwie wpisów
autoryzujących decyduje ich kolejność.
<connectionStrings>
<add name="
LocalSqlServer
” connectionString="data source=.\SQLEXPRESS;
Integrated Security=SSPI;
AttachDBFilename=|DataDirectory|aspnetdb.mdf;
User Instance=true" providerName="System.Data.SqlClient"/>
</connectionStrings>
C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\machine.config
<membership><providers><add name="AspNetSqlMembershipProvider"
type="System.Web.Security.SqlMembershipProvider,
System.Web, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName="LocalSqlServer"
enablePasswordRetrieval="false"
enablePasswordReset="true" requiresQuestionAndAnswer="true"
applicationName="/" requiresUniqueEmail="false" passwordFormat="Hashed"
maxInvalidPasswordAttempts="5"
minRequiredPasswordLength="7"
minRequiredNonalphanumericCharacters="1„
passwordAttemptWindow="10" passwordStrengthRegularExpression=""/>
</providers></membership>
</system.web>
ASP.NET Configuration - Użytkownicy
5
Mechanizm providerów
Składnica
danych
Provider
ASP.NET
I
N
T
E
F
R
E
J
S
Zalety:
• swoboda łączenia ASP.NET z dowolnym składowiskiem danych
• możliwość korzystania z wszystkich udogodnień ASP.NET
• stosunkowo proste tworzenie własncych providerów
Struktura bazy dla użytkowników
6
Kontrolka Login
Właściwości:
• TitleText
• UserNameLoginText
• PasswordLabelText
• RememberMeText
• LoginButtonText
<asp:Login ID="Login1" runat="server"></asp:Login>
Zdarzenia:
• Authenticate
Kontrolka CreateUserWizzard
<asp:CreateUserWizard ID="CreateUserWizard1"
runat="server">
<WizardSteps>
<asp:CreateUserWizardStep runat="server" />
<asp:CompleteWizardStep runat="server" />
</WizardSteps>
</asp:CreateUserWizard>
Zdarzenia:
• CreatingUser
• CreatedUser
7
Kontrolka ChangePassword
<asp:ChangePassword ID="ChangePassword1" runat="server">
</asp:ChangePassword>
Kontrolka PasswordRecovery
<asp:PasswordRecovery ID="PasswordRecovery1" runat="server">
<MailDefinition Subject="Nowe hasło">
</MailDefinition>
</asp:PasswordRecovery>
<system.net>
<mailSettings>
<smtp deliveryMethod="Network" from="admin@polsl.pl">
<network defaultCredentials="true" host="poczta.polsl.pl" port="25" userName="admin" password="adminXYZ"/>
</smtp>
</mailSettings>
</system.net>
web.config
8
Kontrolka LoginStatus
<asp:LoginStatus ID="LoginStatus1" runat="server" />
<asp:LoginView ID="LoginView1" runat="server">
<LoggedInTemplate>
Witaj w "klubie".
</LoggedInTemplate>
<AnonymousTemplate>
Jesteś anonimowy użytkownkiem.
</AnonymousTemplate>
</asp:LoginView>
Kontrolka LoginView
9
Struktura danych dla użytkowników
Kontrolka LoginName
<asp:LoginName ID="LoginName1" runat="server" />
Adam
10
Klasa Membership
Składnica
danych
Membership
Provider
Klasa
Membership
Metody:
• CreateUser
• DeleteUser
• FindUserByEmail
• FindUserByName
• GetUser
• GetAllUsers
• GetNumberOfUsersOnline
• UpdateUser
• ValidateUser
Klasa Membership - przykład
<%@ Page Language="C#" %>
<script runat="server">
protected void btnSpis_Click(object sender, EventArgs e)
{
foreach (MembershipUser mu in Membership.GetAllUsers())
lstUzytkownicy.Items.Add(mu.UserName);
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ListBox ID="lstUzytkownicy" runat="server"></asp:ListBox> <br />
<asp:Button ID="btnSpis" runat="server" onclick="btnSpis_Click" Text="Spis" />
</div>
</form>
</body>
</html>
Klasa MembershipUser
Właściwości:
• UserName
• Email
• CreationDate
• IsOnline
11
Role
Role są odpowiednikiem grup
użytkowników
Autoryzacje można nadawać całym
rolom
ASP.NET nie udostępnia kontrolek do
zarządzania rolami
Konfiguracja ról
<system.web>
<authentication mode="Forms">
<forms loginUrl="~/Logowanie.aspx" />
</authentication>
<authorization>
<deny users="?"/>
</authorization>
</system.web>
<system.web>
<authorization>
<allow roles="Administratorzy"/>
<deny users="*"/>
</authorization>
</system.web>
<connectionStrings>
<add
name="LocalSqlServer”
connectionString="data source=.\SQLEXPRESS;
Integrated Security=SSPI;
AttachDBFilename=|DataDirectory|aspnetdb.mdf;
User Instance=true" providerName="System.Data.SqlClient"/>
</connectionStrings>
C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\machine.config
<roleManager>
<providers>
<add name="AspNetSqlRoleProvider"
connectionStringName="LocalSqlServer"
applicationName="/"
type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
<add name="AspNetWindowsTokenRoleProvider" applicationName="/"
type="System.Web.Security.WindowsTokenRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
</providers>
</roleManager>
12
ASP.NET Configuration - Role
Struktura danych dla ról
13
Klasa Roles
Składnica
danych
Role
Provider
Klasa
Roles
Metody:
• CreateRole
• DeleteRole
• AddUserToRole
• RemoveUserToRole
• GetRolesForUser
• GetUsersInRole
•IsUserInRole
Klasa Roles - przykład
<%@ Page Language="C#" %>
<script runat="server">
protected void btnDodaj_Click(object sender, EventArgs e)
{
if (Membership.GetUser(txtUzytkownik.Text)!=null && !Roles.IsUserInRole(txtUzytkownik.Text,"Administratorzy"))
Roles.AddUserToRole(txtUzytkownik.Text, "Administratorzy");
}
protected void btnUsun_Click(object sender, EventArgs e)
{
if (Membership.GetUser(txtUzytkownik.Text) != null && Roles.IsUserInRole(txtUzytkownik.Text))
Roles.RemoveUserFromRole(txtUzytkownik.Text, "Administratorzy");
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="txtUzytkownik" runat="server"></asp:TextBox>
<asp:Button ID="btnDodaj" runat="server" onclick="btnDodaj_Click" Text="Dodaj" />
<asp:Button ID="btnUsun" runat="server" Text="Usuń" onclick="btnUsun_Click" />
</div>
</form>
</body>
</html>
14
Zmienne profilu użytkownika
Każdy rozpoznany użytkownik może posiadać
swój zestaw zmiennych profilu
Nazwy i typy tych zmiennych należy
zdefiniować w pliku web.config
Zmienne profilowe są dostępne z klasy Profile
Zmienne są przechowywane w bazie danych
Użytkownicy anonimowi mogą mieć
przypisane chwilowe wartości zmiennych
profilowych
Zmienne profilu użytkownika
<system.web>
<profile>
<properties>
<group name="daneOsobowe">
<add name="imie" type="System.String" allowAnonymous="false"/>
<add name="nazwisko" type="System.String" allowAnonymous="false"/>
</group>
<add name="kolor" type="System.Drawing.Color" allowAnonymous="true"/>
</properties>
</profile>
</system.web>
web.config
Profile.daneOsobowe.imie = txtImie.Text;
Profile.daneOsobowe.nazwisko = txtNazwisko.Text;
lblWynik.BackColor = Profile.kolor;
15
Struktura danych dla zmiennych profilowych