SharePoint-Authentifizierung. So erhalten Sie SharePoint-Cookies von ADFS

8

Wir codieren eine Sharepoint-Anwendung, erweitern sie als Provider-gehostet, verwenden das Zertifikat und verankern unser MVC-Projekt damit Erweitern Sie all dies auf demselben IIS, der Sharepoint wurde erweitert.

Aufgabe 1: Ein Benutzer meldet sich bei SharePoint an, startet unsere Anwendung; Die Anwendung startet ohne Autorisierungsanfrage und ruft den Benutzer von Sharepoint ab, in dem sie sich angemeldet hat.

Aufgabe 2: Wenn die Sharepoint-Serviceanforderung erforderlich ist, meldet unsere Anwendung Sharepoint unter demselben Benutzernamen an, unter dem sich der Benutzer Sharepoint angemeldet hat.

Wir haben es versucht:

1) Aufbau einer vom Provider gehosteten App, Schreiben unseres MVC, Erstellen eines selbstsingenden Zertifikats und Anpassen von High-trusted zwischen der Sharepoint-Site und unserer MVC.

Wir haben: Wenn unser MVC die Windows-Authentifizierung verwendet, werden bei der Übertragung in unsere Anwendung der Benutzername und das Passwort erneut angefordert. Wenn Sie sie eingeben, erhalten wir ClientContext bis TokenHelper mit der Methode GetS2SClientContextWithWindowsIdentity .

Wenn die Windows-Authentifizierung deaktiviert ist, wird der Benutzer nicht in der Anforderung angemeldet, und diese Methode reagiert. Ausnahme: Der Benutzer ist nicht angemeldet.

2) Wir haben ADFS installiert und angepasst, Sharepoint für die Arbeit mit ADFS konfiguriert, Adressen von Sharepoint und unsere Anwendung in Relaying Party Trusts geschrieben (in Identifiers and WS-Federation 'Passive Endpoints)

Wir haben: Ein Benutzer meldet sich bei Sharepoint an, und beim Übertragen an unsere Anwendung erhält dieser die Benutzerdaten (Ansprüche)

Damit ist die erste Aufgabe erledigt. Danach trat ein Problem des Zugriffs auf die Sharepoint-Dienste unter dem autorisierten Benutzer auf.

Wir haben versucht, AccessToken für Sharepoint über die erhaltenen Ansprüche zu erhalten Wir haben versucht, die folgenden Ansprüche zu übertragen:

%Vor%

Danach haben wir eine Methode aufgerufen, die AccessToken gemäß den eingegebenen Claims

anspricht %Vor%

Dann haben wir versucht, ClientContext mit der folgenden Methode zu erhalten:

%Vor%

Aber wir haben einen Fehlerbericht:

%Vor%

ClientID und IssureID wurden richtig geschrieben, Kleinbuchstaben

Danach haben wir entschieden, SecurityToken von ADFS mit Hilfe von username und password anzufordern. Nachdem wir es erhalten haben, haben wir in SharepointSTS die Autorisierung mit SecurityToken beantragt. Dann hat unsere Anwendung den Cookie-Sharepoint, der in der Abfrage verankert war (hinzugefügt in CookieContainer FedAuth ), zu den Sharepoint-Diensten hinzugefügt. Bei Aktivierung von ExecutingWebRequest += ClientContext_ExecutingWebRequest passiert das oben erwähnte.

Aber dazu sollte man die username und die password noch einmal anfordern.

Falls wir username und password nicht einreichen, antwortet ADFS mit SecurityToken mit den Daten des Benutzers, unter dessen Namen der Anwendungspool gestartet wurde. Und wir benötigen SecurityToken des Benutzers, der bei SharePoint angemeldet ist. Wir haben auch versucht, SecurityToken

auszugeben %Vor%

Aber die Antwort war nicht die gleiche, die wir für die SharePoint-Autorisierung benötigten.

In ADFS in Endpunkten passen wir die URL an. Das SecurityToken (wresult) , das wir für die SharePoint-Autorisierung benötigen, wird von der POST-Abfrage dorthin gesendet. Das Problem ist, dass wir diese Abfrage in der Anwendung nicht empfangen können, da sie im Status 302 übertragen und von der GET-Methode an unsere Anwendung weitergeleitet wird, ohne SecurityToken mit unserem Cookie.

Die Frage ist: Wie können wir SecurityToken des in SharePoint angemeldeten Benutzers abrufen?

    
Korshikov Denis 05.05.2014, 04:22
quelle

1 Antwort

0

Ich gehe hier eine Laune ein, aber es klingt so, als müssten Sie einen Claims Provider erstellen, eine Klasse, die von SPClaimProvider übernommen wird.

Die Personenauswahl im Sharepoint-Steuerelement, mit der Sie Personen und Gruppen auswählen, erhalten alle Personen und Gruppen von Anspruchstellern.

Standardmäßig gibt es die folgenden Anspruchsanbieter:

AllUsersClaimProvider FormsClaimsProvider ActiveDirectoryClaimsProvider

Wenn Sie eine zusätzliche Schadensbehebung benötigen, müssen Sie eine schreiben, die nicht so schlecht ist.

Ссылка

Im Grunde können Sie mit FillClaimsForEntity neue Ansprüche an einen Identity Principal stellen.

Über die beiden Resolve Overloads können Sie feststellen, ob eine Anspruchsübereinstimmung für die Eingabe vorhanden ist.

z. sagen Sie, dass Sie "Bob" in den Personenwähler eingeben. Die Personenauswahl verwendet dann den SPClaimsOperationManager * (genaue Schreibweise vergessen), um Resolve (Zeichenfolgeneingabe ...) für jeden in der Farm registrierten Anspruchsanbieter aufzurufen.

Sagen wir, wir sprechen über den Forms Claims Provider. Es würde prüfen, ob es einen Benutzer mit einem Benutzernamen oder einer E-Mail-Adresse gibt, die mit Bob übereinstimmt. Für jede Benutzerzuordnung wird eine Auswahleinheit erstellt und der Anspruchstyp auf FormsLogonUser mit dem Wert "Bob" usw. gesetzt. Jede einzelne wird zum Ergebnis hinzugefügt.

Wenn Sie damit fertig sind, sehen Sie entweder Bob in der Personenauswahl, oder Sie sehen Bob mit einer roten Unterstreichung, was bedeutet, dass es sich um mehrere Übereinstimmungen handelt, und Sie müssen wählen.

Es klingt für mich so, als müssten Sie einen bauen, damit der Personenwähler mit Ihren neuen Ansprüchen arbeiten kann.

Sobald Sie einen Anspruchanbieter erstellt und registriert haben, können Sie mithilfe der Personenauswahl den Zugriff auf die Website mithilfe Ihrer Ansprüche gewähren.

In einem Beispielszenario habe ich einmal einen Anspruchsprovider erstellt, der Ansprüche basierend auf den von Nutzern erworbenen Produkten ausstellte.

Also habe ich den Anspruchstyp " Ссылка " (dies kann eine beliebige eindeutige Zeichenfolge sein, die Sie möchten). Und die Werte waren Dinge wie "pd.1234.0". Jetzt habe ich in FillClaimsForEntities den Benutzer nach Entity-Parametern in unserer Datenbank gesucht, um alle ihre Produkte zu erhalten. Dann habe ich für jedes Produkt einen Produktanspruch angelegt und diese zur Schadenliste hinzugefügt.

Dann in Resolve würde ich sehen, ob ein Produkt mit einer ID oder einem Display-Namen existierte, mathing die Auflösungseingabe und eine Picker-Entität erstellen, wenn dies der Fall war.

Das Gleiche gilt für die Suche.

Dann ging ich auf unsere Produktseiten und gewährte den Zugriff auf die Seite für jeden, der den Anspruch dieses Produkts mit der Personenauswahl hatte. "funktioniert wie das Auswählen von Rollen in der Formularauthentifizierung". Art.

Sie können auch die Unterstützung für Claims-Hierarchie kodieren, und Sie können mehrere Bäume in der Personenauswahl haben, 1 Baum für jeden Anspruchstyp, mit dem Sie arbeiten.

z. Sagen Sie "Bob" bringt eine Person, ein Buch und einen Manager zurück. Du könntest 3 Hierarchien haben, 1 für Leute, 1 für Bücher, 1 für Manager, usw. Und die Behauptungen dieses Typs in diesem Baum erscheinen lassen.

Ich ging einen Schritt weiter und machte einen Zugriff verweigert Handler, so dass, wenn ein Benutzer Zugang verweigert für nicht in diesem Produkt beansprucht wurde, es auf die Produkt-Kauf-Seite umgeleitet hat.

    
Ryan Mann 29.08.2014 05:41
quelle

Tags und Links