Πώς να πραγματοποιήσουν έλεγχο ταυτότητας σε υπηρεσία καταλόγου Active Directory, χρησιμοποιώντας τον έλεγχο ταυτότητας φορμών και Visual Basic .NET

Σύνοψη

Αυτό το άρθρο βήμα προς βήμα περιγράφει τον τρόπο μια εφαρμογή του ASP.NET να χρησιμοποιήσετε έλεγχο ταυτότητας φορμών για να επιτρέψετε στους χρήστες να πραγματοποιήσουν έλεγχο ταυτότητας σε υπηρεσία καταλόγου Active Directory, χρησιμοποιώντας το Lightweight Directory Access Protocol (LDAP).

Αφού ο χρήστης ταυτότητας και ανακατεύθυνση, μπορείτε να χρησιμοποιήσετε τη μέθοδο Application_AuthenticateRequest του αρχείου Global.asax για να αποθηκεύσετε ένα αντικείμενο GenericPrincipal στην ιδιότητα HttpContext.User που ρέει σε ολόκληρη την αίτηση.

Δημιουργία μιας εφαρμογής ASP.NET Web στο Visual Basic .NET

Ακολουθήστε τα παρακάτω βήματα για να δημιουργήσετε μια νέα εφαρμογή Web του ASP.NET που ονομάζεται FormsAuthAd στο Visual Basic .NET:
  1. Ξεκινήστε το Microsoft Visual Studio .NET.
  2. Στο μενού αρχείο , επιλέξτε Δημιουργίακαι, στη συνέχεια, κάντε κλικ στο έργο.
  3. Κάντε κλικ στο κουμπί Έργα της Visual Basic στην περιοχή Τύποι έργου, και στη συνέχεια κάντε κλικ στην Εφαρμογή Web του ASP.NET στην περιοχή πρότυπα.
  4. Στο πλαίσιο " θέση ", πληκτρολογήστε http://<servername>/FormsAuthAd (αντικατάσταση http://localhost Εάν χρησιμοποιείτε τον τοπικό διακομιστή (έτσι ώστε να έχετε http://localhost/FormsAuthAdκαι, στη συνέχεια, κάντε κλικ στο κουμπί OK.
  5. Κάντε δεξιό κλικ στον κόμβο αναφορές στην Εξερεύνηση λύσεων και, στη συνέχεια, κάντε κλικ στο κουμπί Προσθήκη αναφοράς.
  6. Στην καρτέλα .NET στο πλαίσιο διαλόγου " Προσθήκη αναφοράς ", κάντε κλικ στο κουμπί System.DirectoryServices.dll, κάντε κλικ στην επιλογήκαι, στη συνέχεια, κάντε κλικ στο κουμπί OK.

Συντάξτε τον κώδικα ελέγχου ταυτότητας

Ακολουθήστε τα παρακάτω βήματα για να δημιουργήσετε ένα νέο αρχείο κλάσης που ονομάζεται LdapAuthentication.vb:
  1. Στην Εξερεύνηση λύσεων, κάντε δεξιό κλικ στον κόμβο του έργου, στην Προσθήκηκαι, στη συνέχεια, κάντε κλικ στην επιλογή Προσθήκη νέου στοιχείου.
  2. Κάντε κλικ στο κουμπί κλάση στην περιοχή πρότυπα.
  3. Στο πλαίσιο όνομα , πληκτρολογήστε LdapAuthentication.vb και, στη συνέχεια, κάντε κλικ στο κουμπί Άνοιγμα.
  4. Αντικαταστήστε τον υπάρχοντα κώδικα στο αρχείο LdapAuthentication.vb με τον ακόλουθο κώδικα:
    Imports SystemImports System.Text
    Imports System.Collections
    Imports System.DirectoryServices

    Namespace FormsAuth
    Public Class LdapAuthentication

    Dim _path As String
    Dim _filterAttribute As String

    Public Sub New(ByVal path As String)
    _path = path
    End Sub

    Public Function IsAuthenticated(ByVal domain As String, ByVal username As String, ByVal pwd As String) As Boolean

    Dim domainAndUsername As String = domain & "\" & username
    Dim entry As DirectoryEntry = New DirectoryEntry(_path, domainAndUsername, pwd)

    Try
    'Bind to the native AdsObject to force authentication.
    Dim obj As Object = entry.NativeObject
    Dim search As DirectorySearcher = New DirectorySearcher(entry)

    search.Filter = "(SAMAccountName=" & username & ")"
    search.PropertiesToLoad.Add("cn")
    Dim result As SearchResult = search.FindOne()

    If (result Is Nothing) Then
    Return False
    End If

    'Update the new path to the user in the directory.
    _path = result.Path
    _filterAttribute = CType(result.Properties("cn")(0), String)

    Catch ex As Exception
    Throw New Exception("Error authenticating user. " & ex.Message)
    End Try

    Return True
    End Function

    Public Function GetGroups() As String
    Dim search As DirectorySearcher = New DirectorySearcher(_path)
    search.Filter = "(cn=" & _filterAttribute & ")"
    search.PropertiesToLoad.Add("memberOf")
    Dim groupNames As StringBuilder = New StringBuilder()

    Try
    Dim result As SearchResult = search.FindOne()
    Dim propertyCount As Integer = result.Properties("memberOf").Count

    Dim dn As String
    Dim equalsIndex, commaIndex

    Dim propertyCounter As Integer

    For propertyCounter = 0 To propertyCount - 1
    dn = CType(result.Properties("memberOf")(propertyCounter), String)

    equalsIndex = dn.IndexOf("=", 1)
    commaIndex = dn.IndexOf(",", 1)
    If (equalsIndex = -1) Then
    Return Nothing
    End If

    groupNames.Append(dn.Substring((equalsIndex + 1), (commaIndex - equalsIndex) - 1))
    groupNames.Append("|")
    Next

    Catch ex As Exception
    Throw New Exception("Error obtaining group names. " & ex.Message)
    End Try

    Return groupNames.ToString()
    End Function
    End Class
    End Namespace



Επεξήγηση του κώδικα

Ο κωδικός ελέγχου ταυτότητας δέχεται έναν τομέα, όνομα χρήστη, κωδικό πρόσβασης και μια διαδρομή για τη δομή της υπηρεσίας καταλόγου Active Directory. Αυτός ο κώδικας χρησιμοποιεί την υπηρεσία παροχής του καταλόγου LDAP.
Έλεγχος ταυτότητας χρήστη
Ο κώδικας στη σελίδα Logon.aspx καλεί τη μέθοδο LdapAuthentication.IsAuthenticated και μεταβιβάζει στις πιστοποιήσεις που συλλέγονται από το χρήστη. Στη συνέχεια, δημιουργείται ένα αντικείμενο DirectoryEntry με τη διαδρομή στη δομή καταλόγου, το όνομα χρήστη και τον κωδικό πρόσβασης. Το όνομα χρήστη πρέπει να είναι στη μορφή "τομέας\όνομα_χρήστη". Το αντικείμενο DirectoryEntry προσπαθεί, στη συνέχεια, για να επιβάλετε τη σύνδεση AdsObject αποκτώντας την ιδιότητα NativeObject . Εάν επιτύχει αυτή η ενέργεια, το χαρακτηριστικό ΣΟ για το χρήστη λαμβάνονται από τη δημιουργία ενός αντικειμένου DirectorySearcher και φιλτράροντας με βάση το SAMAccountName. Μετά τον έλεγχο ταυτότητας του χρήστη, η μέθοδος IsAuthenticated επιστρέφει true.

Σημείωση Όταν χρησιμοποιείτε το LDAP για να συνδέσετε σε ένα αντικείμενο που σχετίζονται με την υπηρεσία καταλόγου Active Directory, χρησιμοποιούνται οι θύρες TCP. Η αυξημένη χρήση των LDAP με το χώρο ονομάτων System.DirectoryServices μπορεί να χρησιμοποιήσει όλες τις θύρες TCP που είναι διαθέσιμες. Ίσως μπορέσετε να μείωση του φόρτου TCP με την επανάληψη χρήσης της σύνδεσης που έχετε χρησιμοποιήσει για τον έλεγχο ταυτότητας του χρήστη.
Ομάδες χρηστών
Για να αποκτήσετε μια λίστα με τις ομάδες στις οποίες ανήκει ο χρήστης, αυτός ο κώδικας καλεί τη μέθοδο LdapAuthentication.GetGroups . Η μέθοδος LdapAuthentication.GetGroups λαμβάνει μια λίστα με ασφάλεια και διανομής ομάδες στις οποίες ανήκει ο χρήστης κατά τη δημιουργία ενός αντικειμένου DirectorySearcher και φιλτράροντας σύμφωνα με το χαρακτηριστικό μέλος της . Αυτή η μέθοδος επιστρέφει μια λίστα ομάδων που διαχωρίζονται με καθέτους (|).

Σημειώστε ότι η μέθοδος LdapAuthentication.GetGroups χειρίζεται και περικόπτει συμβολοσειρές. Αυτό μειώνει το μήκος της συμβολοσειράς που είναι αποθηκευμένη στο cookie ελέγχου ταυτότητας. Εάν η συμβολοσειρά δεν έχει περικοπεί, η μορφή κάθε ομάδα εμφανίζεται ως εξής:
CN=...,...,DC=domain,DC=com
Αυτό μπορεί να δημιουργήσει μια μεγάλη συμβολοσειρά. Εάν το μήκος αυτής της συμβολοσειράς είναι μεγαλύτερο από το μήκος του cookie, ενδέχεται να μην δημιουργηθεί το cookie ελέγχου ταυτότητας. Εάν η συμβολοσειρά αυτή ενδέχεται να είναι μεγαλύτερο από το μήκος του cookie, μπορεί να θέλετε για την αποθήκευση πληροφοριών ομάδας του αντικειμένου ASP.NET Cache ή σε μια βάση δεδομένων. Εναλλακτικά, μπορεί να θέλετε να κρυπτογραφήσετε τις πληροφορίες της ομάδας και να αποθηκεύουν αυτές τις πληροφορίες σε ένα κρυφό πεδίο φόρμας.

Συντάξτε τον κώδικα Global.asax

Ο κώδικας στο αρχείο Global.asax παρέχει ένα πρόγραμμα χειρισμού συμβάντων Application_AuthenticateRequest . Αυτό το πρόγραμμα χειρισμού συμβάντων ανακτά το cookie ελέγχου ταυτότητας από τη συλλογή Context.Request.Cookies , αποκρυπτογραφεί το cookie και ανακτά τη λίστα των ομάδων που θα αποθηκευτούν στην ιδιότητα FormsAuthenticationTicket.UserData . Οι ομάδες εμφανίζονται σε μια λίστα διαχωρισμένη σωλήνα που δημιουργείται στη σελίδα Logon.aspx.

Ο κωδικός αναλύει τη συμβολοσειρά σε μια συμβολοσειρά πίνακα για να δημιουργήσετε ένα αντικείμενο GenericPrincipal . Μετά τη δημιουργία του αντικειμένου GenericPrincipal , αυτό το αντικείμενο τοποθετείται στην ιδιότητα HttpContext.User .
  1. Στην Εξερεύνηση λύσεων, κάντε δεξιό κλικ Global.asax, και στη συνέχεια κάντε κλικ στο κουμπί Προβολή κώδικα.
  2. Προσθέστε τον ακόλουθο κώδικα στο επάνω μέρος του κώδικα, πίσω από το αρχείο Global.asax.vb:
    Imports System.Web.SecurityImports System.Security.Principal

  3. Αντικαταστήστε το υπάρχον στοιχείο χειρισμού συμβάντος κενό για το Application_AuthenticateRequest με τον ακόλουθο κώδικα:
    Sub Application_AuthenticateRequest(ByVal sender As Object, ByVal e As EventArgs)        ' Fires upon attempting to authenticate the use
    Dim cookieName As String = FormsAuthentication.FormsCookieName
    Dim authCookie As HttpCookie = Context.Request.Cookies(cookieName)

    If (authCookie Is Nothing) Then
    'There is no authentication cookie.
    Return
    End If

    Dim authTicket As FormsAuthenticationTicket = Nothing

    Try
    authTicket = FormsAuthentication.Decrypt(authCookie.Value)
    Catch ex As Exception
    'Write the exception to the Event Log.
    Return
    End Try

    If (authTicket Is Nothing) Then
    'Cookie failed to decrypt.
    Return
    End If

    'When the ticket was created, the UserData property was assigned a
    'pipe-delimited string of group names.
    Dim groups As String() = authTicket.UserData.Split(New Char() {"|"})

    'Create an Identity.
    Dim id As GenericIdentity = New GenericIdentity(authTicket.Name, "LdapAuthentication")

    'This principal flows throughout the request.
    Dim principal As GenericPrincipal = New GenericPrincipal(id, groups)

    Context.User = principal

    End Sub

Τροποποιήστε το αρχείο Web.config

Σε αυτήν την ενότητα, ρυθμίζετε το
φόρμες, το
ο έλεγχος ταυτότητας, καθώς και η
στοιχεία ελέγχου ταυτότητας στο αρχείο Web.config. Με αυτές τις αλλαγές, μόνο οι εξουσιοδοτημένοι χρήστες μπορούν να αποκτήσουν πρόσβαση στην εφαρμογή και χωρίς έλεγχο ταυτότητας αιτήσεις ανακατευθύνονται σε μια σελίδα Logon.aspx. Μπορείτε να τροποποιήσετε αυτή τη ρύθμιση παραμέτρων για να επιτρέψετε μόνο ορισμένους χρήστες και ομάδες πρόσβαση στην εφαρμογή.

Αντικαταστήστε τον υπάρχοντα κώδικα στο αρχείο Web.config, με τον ακόλουθο κώδικα:
<?xml version="1.0" encoding="utf-8" ?><configuration>    
<system.web>
<authentication mode="Forms">
<forms loginUrl="logon.aspx" name="adAuthCookie" timeout="60" path="/" >
</forms>
</authentication>
<authorization>
<deny users="?" />
<allow users="*" />
</authorization>
<identity impersonate="true" />
</system.web>
</configuration>

Ανακοίνωση της απομίμηση ταυτότητας = "true" / στοιχείο παραμέτρων. Αυτό προκαλεί ASP.NET για να απομιμούνται το λογαριασμό που έχει ρυθμιστεί ως ο ανώνυμος λογαριασμός από το Microsoft Internet Information Services (IIS). Ως αποτέλεσμα αυτής της ρύθμισης παραμέτρων, όλες τις αιτήσεις για αυτήν την εφαρμογή εκτελείται στο περιβάλλον ασφαλείας του ρυθμισμένου λογαριασμού. Ο χρήστης παρέχει διαπιστευτήρια για να πραγματοποιήσουν έλεγχο ταυτότητας σε υπηρεσία καταλόγου Active Directory, αλλά το λογαριασμό που έχει πρόσβαση σε υπηρεσία καταλόγου Active Directory είναι ο λογαριασμός που έχει ρυθμιστεί. Για περισσότερες πληροφορίες, ανατρέξτε στην ενότητα ΑΝΑΦΟΡΈΣ .

Ρύθμιση παραμέτρων των υπηρεσιών IIS για ανώνυμος έλεγχος ταυτότητας

Για να ρυθμίσετε τις παραμέτρους των υπηρεσιών IIS για ανώνυμος έλεγχος ταυτότητας, ακολουθήστε τα εξής βήματα:
  1. Στην κονσόλα διαχείρισης υπηρεσιών Internet Information Services (IIS), κάντε δεξιό κλικ στον εικονικό κατάλογο κόμβο για "FormsAuthAd".
  2. Κάντε κλικ στις Ιδιότητεςκαι, στη συνέχεια, κάντε κλικ στην καρτέλα Ασφάλεια καταλόγου .
  3. Κάντε κλικ στο κουμπί Επεξεργασία στην περιοχή ανώνυμη πρόσβαση και ρυθμίσεις ελέγχου ταυτότητας.
  4. Επιλέξτε το πλαίσιο ελέγχου Ανώνυμης πρόσβασης .
  5. Κάνετε τον ανώνυμο λογαριασμό για την εφαρμογή ενός λογαριασμού που έχει δικαιώματα για την υπηρεσία καταλόγου Active Directory.
  6. Κάντε κλικ για να καταργήσετε το πλαίσιο ελέγχου Δυνατότητα IIS Έλεγχος κωδικού πρόσβασης .
Ο προεπιλεγμένος IUSR_όνομα_υπολογιστή λογαριασμός δεν έχει δικαιώματα για την υπηρεσία καταλόγου Active Directory.

Δημιουργία της σελίδας Logon.aspx

Ακολουθήστε τα παρακάτω βήματα για να δημιουργήσετε μια νέα φόρμα Web ASP.NET που ονομάζεται Logon.aspx:
  1. Στην Εξερεύνηση λύσεων, κάντε δεξιό κλικ στον κόμβο του έργου, στην Προσθήκηκαι, στη συνέχεια, κάντε κλικ στο κουμπί Προσθήκη φόρμας Web.
  2. Πληκτρολογήστε Logon.aspx στο πλαίσιο όνομα και, στη συνέχεια, κάντε κλικ στο κουμπί Άνοιγμα.
  3. Στην Εξερεύνηση λύσεων, κάντε δεξιό κλικ στο Logon.aspxκαι, στη συνέχεια, κάντε κλικ στην Προβολή "Σχεδίαση".
  4. Κάντε κλικ στην καρτέλα HTML στη σχεδίαση.
  5. Αντικαταστήστε τον υπάρχοντα κωδικό με τον ακόλουθο κώδικα:
    <%@ Page language="vb" AutoEventWireup="true" %><%@ Import Namespace="FormsAuthAd.FormsAuth" %>
    <html>
    <body>
    <form id="Login" method="post" runat="server">
    <asp:Label ID="Label1" Runat="server">Domain:</asp:Label>
    <asp:TextBox ID="txtDomain" Runat="server"></asp:TextBox><br>
    <asp:Label ID="Label2" Runat="server">Username:</asp:Label>
    <asp:TextBox ID="txtUsername" Runat="server"></asp:TextBox><br>
    <asp:Label ID="Label3" Runat="server">Password:</asp:Label>
    <asp:TextBox ID="txtPassword" Runat="server" TextMode="Password"></asp:TextBox><br>
    <asp:Button ID="btnLogin" Runat="server" Text="Login" OnClick="Login_Click"></asp:Button><br>
    <asp:Label ID="errorLabel" Runat="server" ForeColor="#ff3300"></asp:Label><br>
    <asp:CheckBox ID="chkPersist" Runat="server" Text="Persist Cookie" />
    </form>
    </body>
    </html>
    <script runat="server">
    sub Login_Click(sender as object,e as EventArgs)
    Dim adPath as String = "LDAP://DC=..,DC=.." 'Path to your LDAP directory server
    Dim adAuth as LdapAuthentication = new LdapAuthentication(adPath)
    try
    if(true = adAuth.IsAuthenticated(txtDomain.Text, txtUsername.Text, txtPassword.Text)) then
    Dim groups as string = adAuth.GetGroups()

    'Create the ticket, and add the groups.
    Dim isCookiePersistent as boolean = chkPersist.Checked
    Dim authTicket as FormsAuthenticationTicket = new FormsAuthenticationTicket(1, _
    txtUsername.Text,DateTime.Now, DateTime.Now.AddMinutes(60), isCookiePersistent, groups)

    'Encrypt the ticket.
    Dim encryptedTicket as String = FormsAuthentication.Encrypt(authTicket)

    'Create a cookie, and then add the encrypted ticket to the cookie as data.
    Dim authCookie as HttpCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket)

    if(isCookiePersistent = true) then
    authCookie.Expires = authTicket.Expiration
    end if
    'Add the cookie to the outgoing cookies collection.
    Response.Cookies.Add(authCookie)

    'You can redirect now.
    Response.Redirect(FormsAuthentication.GetRedirectUrl(txtUsername.Text, false))

    else
    errorLabel.Text = "Authentication did not succeed. Check user name and password."
    end if

    catch ex as Exception
    errorLabel.Text = "Error authenticating. " & ex.Message
    end try
    end sub
    </script>

  6. Για να τροποποιήσετε τη διαδρομή στη σελίδα Logon.aspx ώστε να δείχνει προς το διακομιστή καταλόγου LDAP.
Η σελίδα Logon.aspx είναι μια σελίδα που συλλέγει τις πληροφορίες από το χρήστη και κλήση μεθόδων στην κλάση LdapAuthentication . Μετά τον κωδικό ελέγχει την ταυτότητα του χρήστη και αποκτά μια λίστα των ομάδων, τον κώδικα εκτελεί τις παρακάτω ενέργειες με την εξής σειρά:
  • δημιουργεί ένα αντικείμενο FormsAuthenticationTicket .
  • κρυπτογραφεί το εισιτήριο;
  • Προσθέτει το εισιτήριο κρυπτογραφημένο σε ένα cookie.
  • Προσθέτει το cookie για τη συλλογή HttpResponse.Cookies .
  • ανακατευθύνει την αίτηση στο URL που είχε ζητηθεί αρχικά.

Τροποποιήστε τη σελίδα αρχείο WebForm1.aspx

Το αρχείο WebForm1.aspx σελίδας είναι η σελίδα που ζητήθηκε αρχικά. Όταν ο χρήστης ζητά αυτήν τη σελίδα, γίνεται ανακατεύθυνση στη σελίδα Logon.aspx. Αφού έχει γίνει έλεγχος ταυτότητας της αίτησης, γίνεται ανακατεύθυνση στη σελίδα αρχείο WebForm1.aspx.
  1. Στην Εξερεύνηση λύσεων, κάντε δεξιό κλικ στο αρχείο WebForm1.aspxκαι, στη συνέχεια, κάντε κλικ στην Προβολή "Σχεδίαση".
  2. Κάντε κλικ στην καρτέλα HTML στη σχεδίαση.
  3. Αντικαταστήστε τον υπάρχοντα κωδικό με τον ακόλουθο κώδικα:
    <%@ Page language="vb" AutoEventWireup="true" %><%@ Import Namespace="System.Security.Principal" %>
    <html>
    <body>
    <form id="Form1" method="post" runat="server">
    <asp:Label ID="lblName" Runat="server" /><br>
    <asp:Label ID="lblAuthType" Runat="server" />
    </form>
    </body>
    </html>
    <script runat="server">
    sub Page_Load(sender as object, e as EventArgs)
    lblName.Text = "Hello " + Context.User.Identity.Name & "."
    lblAuthType.Text = "You were authenticated using " & Context.User.Identity.AuthenticationType & "."
    end sub
    </script>

  4. Αποθηκεύστε όλα τα αρχεία και στη συνέχεια να μεταγλωττίσετε το έργο.
  5. Ζητήσει τη σελίδα αρχείο WebForm1.aspx. Παρατηρήστε ότι θα μεταφερθείτε σε Logon.aspx.
  6. Πληκτρολογήστε τις πιστοποιήσεις σύνδεσης και στη συνέχεια κάντε κλικ στο κουμπί υποβολής. Όταν οι αιτήσεις ανακατευθύνονται στο αρχείο WebForm1.aspx, παρατηρήστε ότι εμφανίζεται το όνομα χρήστη σας και ότι το LdapAuthentication είναι ο έλεγχος ταυτότητας τύπου για την ιδιότητα Context.User.Identity.AuthenticationType .
Σημείωση Η Microsoft συνιστά να χρησιμοποιείτε κρυπτογράφηση Secure Sockets Layer (SSL), όταν χρησιμοποιείτε έλεγχο ταυτότητας φορμών. Αυτό συμβαίνει επειδή ο χρήστης προσδιορίζεται με βάση το cookie ελέγχου ταυτότητας και κρυπτογράφησης SSL σε αυτήν την εφαρμογή αποτρέπει άλλα άτομα να θέτουν σε κίνδυνο το cookie ελέγχου ταυτότητας και άλλες πολύτιμες πληροφορίες που μεταδίδεται.

Αναφορές

Για περισσότερες πληροφορίες, κάντε κλικ στους αριθμούς των άρθρων παρακάτω, για να προβάλετε τα άρθρα της Γνωσιακής Βάσης της Microsoft:
306590 Επισκόπηση της ασφάλειας ASP.NET

317012 ταυτότητα αίτησης και διαδικασίας στο ASP.NET

306238 Τρόπος υλοποίησης με βάση τους ρόλους ασφαλείας με έλεγχο ταυτότητας που βασίζεται σε φόρμες της εφαρμογής ASP.NET χρησιμοποιώντας τη Visual Basic .NET

313091 Τρόπος δημιουργίας κλειδιών με χρήση της Visual Basic .NET για χρήση του ελέγχου ταυτότητας φορμών

313116 οι αιτήσεις ελέγχου ταυτότητας φορμών δεν μεταβαίνετε στη σελίδα loginUrl

Ιδιότητες

Αναγνωριστικό άρθρου: 326340 - Τελευταία αναθεώρηση: 9 Ιαν 2017 - Αναθεώρηση: 1

Σχόλια