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?