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:
Danach haben wir eine Methode aufgerufen, die AccessToken
gemäß den eingegebenen Claims
Dann haben wir versucht, ClientContext
mit der folgenden Methode zu erhalten:
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
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?
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.
Tags und Links asp.net-mvc c# adfs2.0 sharepoint