2014-05-05 11 views
8

Kodujemy aplikację Sharepoint, rozwijamy ją jako hosta dostawcy, używając certyfikatu i zakotwiczamy nasz projekt MVC na numer Rozwiń wszystko na tym samym IIS, do którego został rozszerzony Sharepoint.Uwierzytelnianie SharePoint. Jak zdobyć plik cookie SharePoint z ADFS

Zadanie nr 1: użytkownik loguje się w SharePoint, uruchamia naszą aplikację; uruchamiany bez żądania autoryzacji i dostaje użytkownikowi Sharepoint jest zalogowany

Zadanie nr 2:. Jeśli żądanie usługi SharePoint jest to konieczne, nasze logi aplikacji SharePoint na tej samej nazwy użytkownika zalogowanego użytkownika Sharepoint.

Staraliśmy:

1) Budowanie aplikacji Provider-gospodarzem, pisanie naszą MVC w nim, tworząc certyfikat self-śpiew, dostosowując wysoka zaufany pomiędzy miejscem Sharepoint i naszej MVC.

Mamy: Jeśli nasz MVC używa uwierzytelniania systemu Windows, a następnie po przeniesieniu do naszej aplikacji, nazwa użytkownika i hasło są wymagane kółko; wprowadzając je, możemy uzyskać ClientContext do TokenHelper przy użyciu metody GetS2SClientContextWithWindowsIdentity.

Jeśli uwierzytelnianie systemu Windows jest wyłączona, wówczas użytkownik nie jest zalogowany w żądaniu, a ta metoda odpowiada różnicą, że użytkownik nie jest zalogowany.

2) Zainstalowaliśmy i dostosowane ADFS, skonfigurowany Sharepoint do pracy z ADFS pisał adresy SharePoint i naszej aplikacji w przekazywaniu Party trustów (w Identifiers and WS-Federtation` pasywne punkty końcowe)

Mamy: użytkownik loguje się Sharepoint, a po przeniesieniu się do naszego wniosku, la tter pobiera dane użytkownika (roszczenia)

W ten sposób pierwsze zadanie zostało rozładowane. Po tym, problem z uzyskaniem dostępu do usług SharePoint pod uprawnionego użytkownika powstał

Próbowaliśmy dostać AccessToken dla SharePoint przez Zastrzeżeń otrzymaliśmy Staraliśmy się przenieść następującymi zastrzeżeniami:

nii":"trusted:adfs 
nii":"urn:office:idp:forms:adfs201 //adfs201 - name of our ADFS service 
upn:UserLogin 
emailaddress:[email protected] 

po tym, nazwaliśmy sposób reaguje AccessToken według wprowadzonych zastrzeżeń

string issuer = string.IsNullOrEmpty(sourceRealm) ? issuerApplication : string.Format("{0}@{1}", issuerApplication, sourceRealm); 
    string nameid = string.IsNullOrEmpty(sourceRealm) ? sourceApplication : string.Format("{0}@{1}", sourceApplication, sourceRealm); 
    string audience = string.Format("{0}/{1}@{2}", targetApplication, targetApplicationHostName, targetRealm); 

    List<JsonWebTokenClaim> actorClaims = new List<JsonWebTokenClaim>(); 
    actorClaims.Add(new JsonWebTokenClaim(JsonWebTokenConstants.ReservedClaims.NameIdentifier, nameid)); 
    if (trustedForDelegation && !appOnly) 
    { 
     actorClaims.Add(new JsonWebTokenClaim(TokenHelper.TrustedForImpersonationClaimType, "true")); 
    }  

    if (addSamlClaim) 
     actorClaims.Add(new JsonWebTokenClaim(samlClaimType, samlClaimValue)); 

    // Create token 
    JsonWebSecurityToken actorToken = new JsonWebSecurityToken(
     issuer: issuer, 
     audience: audience, 
     validFrom: DateTime.UtcNow, 
     validTo: DateTime.UtcNow.AddMinutes(TokenLifetimeMinutes), 
     signingCredentials: SigningCredentials, 
     claims: actorClaims); 

    string actorTokenString = new JsonWebSecurityTokenHandler().WriteTokenAsString(actorToken); 

    if (appOnly) 
    { 
     // App-only token is the same as actor token for delegated case 
     return actorTokenString; 
    } 

    List<JsonWebTokenClaim> outerClaims = null == claims ? new List<JsonWebTokenClaim>() : new List<JsonWebTokenClaim>(claims); 
    outerClaims.Add(new JsonWebTokenClaim(ActorTokenClaimType, actorTokenString)); 

    //**************************************************************************** 
    //SPSAML 
    if (addSamlClaim) 
     outerClaims.Add(new JsonWebTokenClaim(samlClaimType, samlClaimValue)); 
    //**************************************************************************** 

    JsonWebSecurityToken jsonToken = new JsonWebSecurityToken(
     nameid, // outer token issuer should match actor token nameid 
     audience, 
     DateTime.UtcNow, 
     DateTime.UtcNow.AddMinutes(10), 
     outerClaims); 

    string accessToken = new JsonWebSecurityTokenHandler().WriteTokenAsString(jsonToken); 

Następnie staraliśmy się ClientContext, nas ing metodę:

GetClientContextWithAccessToken(targetApplicationUri.ToString(), accessToken); 

Ale mamy raport o błędzie:

401 Unauthorized 

ClientID i IssureID zostały napisane prawo, małą

Po tym, zdecydowaliśmy się poprosić SecurityToken z ADFS z pomocą z username i password. Po otrzymaniu, poprosiliśmy o autoryzację w SharepointSTS przy użyciu SecurityToken. Następnie nasza aplikacja otrzymała Cookie Sharepoint, który został zakotwiczony w zapytaniu (dodanym w CookieContainer FedAuth) do usług SharePoint. Po aktywowaniu ExecutingWebRequest += ClientContext_ExecutingWebRequest powyższe czynności mają miejsce.

Ale tego należy użyć, aby być wymagane username i password ponownie.

W przypadku nie przedłożenia username i password, następnie ADFS odpowiada SecurityToken z danymi użytkownika, pod nazwą której pula aplikacji został uruchomiony. I potrzebujemy SecurityToken z zalogowanego użytkownika SharePoint. Próbowaliśmy także emitować SecurityToken

var session = System.IdentityModel.Services.FederatedAuthentication.SessionAuthenticationModule.CreateSessionSecurityToken(ClientPrincipals, "context", DateTime.UtcNow, System.DateTime.UtcNow.AddHours(1), true); 
System.IdentityModel.Services.FederatedAuthentication.SessionAuthenticationModule.AuthenticateSessionSecurityToken(session, true); 

ale odpowiedź nie była taka sama, co potrzebne do autoryzacji SharePoint.

W programie ADFS w punktach końcowych dostosowujemy adres URL; to właśnie SecurityToken (wresult) potrzebujemy do autoryzacji SharePoint jest wysyłane do niego przez zapytanie POST. Problem polega na tym, że nie możemy otrzymać tego zapytania w aplikacji, ponieważ jest nadawany w stanie 302 i przekierowywany do naszej aplikacji metodą GET, bez SecurityToken z naszym ciasteczkiem.

Pytanie brzmi: jak możemy uzyskać SecurityToken użytkownika zalogowanego w SharePoint?

Odpowiedz

0

Przechodzenie tutaj na kaprys, ale wygląda na to, że trzeba utworzyć dostawcę roszczeń, który jest klasą dziedziczącą po SPClaimProvider.

Selektor osób w programie Sharepoint, który jest formantem używanym do wybierania osób i grup, otrzymuje wszystkie osoby i grupy od dostawców roszczeń.

Po wyjęciu z pudełka, istnieją następujące Providers roszczenia,

AllUsersClaimProvider FormsClaimsProvider ActiveDirectoryClaimsProvider

Jeśli potrzebujesz dodatkowej uchwały zastrzeżeń, trzeba napisać, co nie jest tak źle.

http://msdn.microsoft.com/en-us/library/office/ee537299(v=office.15).aspx

Zasadniczo FillClaimsForEntity gdzie można wyemitować nowe roszczeń do Zamawiającego Identity.

Dwa Resolve Przeciążenia to miejsce, w którym można zobaczyć, czy istnieje dopasowanie roszczenia do danych wejściowych.

E.g. powiedz, że wpisujesz "Boba" w selektorze osób. Selektor osób następnie używa narzędzia SPClaimsOperationManager * (zapomnij dokładnej pisowni), aby wywołać funkcję Resolve (dane wejściowe ciągu znaków ...) dla każdego dostawcy roszczeń zarejestrowanego w farmie.

Powiedzmy, że mówimy o dostawcy roszczeń Forms. Sprawdziłby, czy jest jakiś użytkownik o nazwie użytkownika lub adresie e-mail pasującym do Boba. Dla każdego boba odwzorowującego użytkownika utworzy on jednostkę wyboru i ustawi jej typ oświadczenia na FormsLogonUser z wartością bob itp. I dodaje każdy do wyniku.

Kiedy to zrobisz, zobaczysz Boba w selektorze osób, który został wybrany, lub zobaczysz Boba z czerwonym podkreśleniem, co oznacza, że ​​były to wielokrotne mecze i musisz wybrać.

Wydaje mi się, że trzeba go zbudować, aby umożliwić pracownikom wybór nowych roszczeń.

Po utworzeniu i zarejestrowaniu dostawcy roszczeń można użyć selektora osób do przyznania dostępu do witryny przy użyciu roszczeń.

W przypadku przykładowego scenariusza raz złożyłem reklamację, która wystawiała roszczenia na podstawie produktów zakupionych przez użytkowników.

Zrobiłem więc rodzaj roszczenia "http://blah.com/schema/claims/product" (może to być dowolny unikalny ciąg, który ma być). Wartości były takie jak "pd.1234.0". Teraz w FillClaimsForEntities sprawdziłem użytkownika w parametrze entity w naszej bazie danych, aby uzyskać wszystkie jego produkty. Następnie utworzyłem oświadczenie o produkcie dla każdego produktu i dodałem je do listy roszczeń.

Następnie w Resolve chciałbym sprawdzić, czy produkt istniał z identyfikatorem lub wyświetlaną nazwą, analizując dane wejściowe i utworzy element wyboru, jeśli tak się stało.

To samo dotyczy wyszukiwania.

Następnie wszedłem na nasze strony produktów i przyznano dostęp do strony każdemu, kto zgłosił roszczenie do tego produktu za pomocą próbnika osób. "działa jak wybieranie ról w uwierzytelnianiu formularzy".

Możesz również kodować obsługę Heirarchy roszczeń i możesz mieć wiele drzew w selektorze osób, 1 drzewo dla każdego typu roszczenia, z którym pracujesz.

E.g. powiedz "Bob" przywraca osobę, książkę i menedżera. Możesz mieć 3 heirarchie, 1 dla ludzi, 1 dla książek, 1 dla menedżerów itp. I sprawić, by roszczenia tego typu pojawiały się w tym drzewie.

Poszedłem o krok dalej i wykonałem procedurę obsługi odmowy dostępu, aby uniemożliwić użytkownikowi dostęp do tego produktu, przekierowano go na stronę zakupu produktów.

Powiązane problemy