FBA και SQL Server: Μια ιστορία αγάπης

Ο συνάδελφός μου έχει εργαστεί σε ένα τμήμα web σε ένα περιβάλλον FBA. Μεταξύ άλλων, το τμήμα web τραβά ορισμένα δεδομένα από το διακομιστή SQL. Το μεγαλεπήβολο σχέδιο για το έργο αυτό υπαγορεύει ότι ένα DBA ρυθμίζει επίπεδο ασφαλείας δεδομένων σε SQL (σε αντίθεση με την ενσωμάτωση ένα ID χρήστη σε ένα ερώτημα SQL ή κάποια άλλη προσέγγιση).

Το πρόβλημα είναι ότι SQL server δεν γνωρίζει τίποτα σχετικά με το περιβάλλον μας FBA έτσι αυτό δεν είναι δυνατό να μας εμπιστευθείτε. Θα λυθεί αυτό το πρόβλημα από, ελλείψει μιας καλύτερης λέξης, απομίμηση με μη αυτόματο τρόπο μια AD χρήστη έτσι ώστε θα μπορούσε να συνδεθεί σε SQL, τέτοια ώστε δεδομένων SQL επίπεδο ασφαλείας έργων.

Ακόμα κι αν FBA είναι ένα χαρακτηριστικό γνώρισμα του ASP.NET, Εμείς SharePoint έθνος άνθρωποι έχουν διδάξει την διάφορες της αναζήτησης κινητήρες που αν όπου εκτελείται το ερώτημα για FBA, πρέπει να εννοείς ότι θέλετε να ξέρετε πώς να ρυθμίσετε FBA στο SharePoint. Απέτυχα να βρείτε βρείτε οποιαδήποτε πληροφορία σχετικά με την ενεργοποίηση ενός FBA προσανατολισμό ASP.NET εφαρμογή να επικοινωνήσει με SQL με τον τρόπο που χρειαζόμασταν.

Κατά τη διάρκεια έρευνα αυτό, ξαναδιάβασε το άρθρο: ASP.NET απομίμησης

Περισσότερη έρευνα μας οδήγησε σε αυτό το άρθρο codproject: http://www.codeproject.com/KB/cs/cpimpersonation1.aspx

Που μας βοήθησε να γράψετε κώδικα μας, που έχω συμπεριληφθεί κάτω από. Δεν είναι το πιο κομψό πράγματα, μα αυτό έλυσα. Ελπίζω να το βρείτε χρήσιμο.

Εδώ είναι ο κώδικας που εργάστηκε για μας:

προστατεύονται άκυρη btnSearchCarrier_Click(αντικείμενο αποστολέα, Ε EventArgs)
 {
 Δοκιμάστε
 {
 ImpersonateUser iU = νέα ImpersonateUser();
 // TODO: Αντικατάσταση εντολής iU.Impersonate(«DomainName», "Όνομα χρήστη", "Κωδικός πρόσβασης");

//
 ΚΏΔΙΚΑ
//

 iU.Undo();
 }
 αλιευμάτων (Εξαίρεση πρώην)
 {

 }
 }

// Χρησιμοποιώντας απομίμησης τάξη, όπως αναφέρεται παρακάτω.

δημόσια Κατηγορία ImpersonateUser
 {
 [DllImport("advapi32.dll", SetLastError = TRUE)]
 δημόσια στατική extern Bool σύνδεση χρήστη(
 Συμβολοσειρά lpszUsername,
 Συμβολοσειρά lpszDomain,
 Συμβολοσειρά lpszPassword,
 int dwLogonType,
 int dwLogonProvider,
 REF IntPtr phToken);

 [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
 ιδιωτική extern στατική Bool CloseHandle(IntPtr λαβή);

 ιδιωτική στατική IntPtr tokenHandle = νέα IntPtr(0);
 ιδιωτική στατική WindowsImpersonationContext impersonatedUser;

 // Εάν έχετε ενσωματώσει αυτόν τον κώδικα σε ένα αρχείο DLL, να είστε βέβαιος να απαιτήσουμε ότι
 // τρέχει με FullTrust.
 [PermissionSetAttribute(SecurityAction.Demand, Όνομα = "FullTrust")]
 δημόσια άκυρη απομίμηση Impersonate(συμβολοσειρά όνομα_τομέα, συμβολοσειρά ονόματος χρήστη, συμβολοσειρά κωδικού πρόσβασης)
 {
 Δοκιμάστε
 {

 // Χρησιμοποιήστε τη μη διαχειριζόμενη σύνδεση χρήστη συνάρτηση να κουπόνι για το χρήστη
 // ο καθορισμένος χρήστης, τομέα, και τον κωδικό πρόσβασης.
 CONST int LOGON32_PROVIDER_DEFAULT = 0;

 // Περνώντας την παράμετρο αυτή προκαλεί σύνδεση χρήστη για να δημιουργήσετε ένα πρωτεύον Διακριτικό.
 CONST int LOGON32_LOGON_INTERACTIVE = 2;
 tokenHandle = IntPtr.Zero;

 // Βήμα -1 Καλέσετε η σύνδεση χρήστη για να αποκτήσετε μια λαβή σε ένα διακριτικό πρόσβασης.
 Bool returnValue = σύνδεση χρήστη(
 όνομα χρήστη,
 όνομα_τομέα,
 Κωδικός πρόσβασης,
 LOGON32_LOGON_INTERACTIVE,
 LOGON32_PROVIDER_DEFAULT,
 REF tokenHandle); // tokenHandle - νέο κωδικό ασφαλείας

 Αν (FALSE == returnValue)
 {
 int ret = Marshal.GetLastWin32Error();
 Console.WriteLine("Σύνδεση χρήστη κλήση απέτυχε με κωδικό σφάλματος : " +
 RET);
 ρίξει νέα System.ComponentModel.Win32Exception(RET);
 }

 // Βήμα - 2
 WindowsIdentity newId = νέα WindowsIdentity(tokenHandle);
 // Βήμα -3
 impersonatedUser = newId.Impersonate();

 }
 αλιευμάτων (Εξαίρεση πρώην)
 {
 Console.WriteLine("Παρουσιάστηκε εξαίρεση. " + πρώην.Μήνυμα);
 }
 }


 /// <Περίληψη>
 /// Στάσεις απομίμησης
 /// </Περίληψη>
 δημόσια Ακύρωση αναίρεσης()
 {
 impersonatedUser.Undo();
 // Δωρεάν τα διακριτικά.
 Αν (tokenHandle != IntPtr.Zero)
 CloseHandle(tokenHandle);
 }
 }

</Τέλος>

Εγγραφείτε στο blog μου.

Technorati Tags:

Μία σκέψη για «FBA και SQL Server: Μια ιστορία αγάπης

  1. David νωρίς
    Συγγνώμη για την απόσπαση αυτή άσχετη ερώτηση, αλλά δεν μπορούσα να καταλάβω πώς να σας στείλουμε ένα μήνυμα ηλεκτρονικού ταχυδρομείου από αυτό το blog.
    Είχατε μια προηγούμενη θέση όπου σας προσφέρεται ένας πολύ καλός τρόπος για να φιλτράρετε μια βιβλιοθήκη για να προβάλετε δεδομένα χωρίς tag. Έχετε οποιεσδήποτε σκέψεις ως προς το πώς θα μπορούσε να μπορείτε να προβάλετε μια λίστα των εγγράφων χωρίς tag σε μια βιβλιοθήκη ολόκληρο το έγγραφο? Χρησιμοποιώντας ένα κενό πεδίο, σε προχωρημένη αναζήτηση δεν επιστρέφει κανένα αποτέλεσμα.

Αφήνω μια απάντηση

Η διεύθυνση email σας δεν θα δημοσιευθεί. τα απαιτούμενα πεδία είναι επισημασμένα *