我們使用證書編寫Sharepoint應用程序,將其擴展爲提供程序託管,並將我們的MVC項目錨定到它 在Sharepoint展開的同一IIS上展開所有這些。Sharepoint身份驗證。如何從ADFS獲取SharePoint cookie
任務#1:用戶登錄Sharepoint,啓動我們的應用程序;應用程序啓動時沒有任何授權請求,並得到從SharePoint它登錄的用戶
任務#2:如果SharePoint服務請求是必要的,我們在SharePoint應用程序日誌中的用戶名登錄的用戶登錄SharePoint中。
我們嘗試:
1)構建供應商提供託管應用程序,它寫我們的MVC,創建自唱證書,調整高信任的SharePoint網站和我們的MVC之間。
我們得到: 如果我們的MVC使用Windows身份驗證,然後轉移到我們的應用程序時,用戶名和密碼被要求一遍又一遍;當輸入它們時,我們可能使用GetS2SClientContextWithWindowsIdentity
方法得到ClientContext
到TokenHelper
。
如果Windows身份驗證被禁用,則用戶沒有登錄請求,這個方法來響應不同的是,用戶沒有登錄。
2) 我們安裝和調整ADFS,配置的Sharepoint與ADFS工作,寫(-Federtation` WS無源端點在Identifiers and
)SharePoint和我們在繼電保護方信任的應用程序的地址
我們得到: 用戶登錄SharePoint和轉移到我們的應用程序時,該啦tter獲得用戶數據(索賠)
因此,第一項任務已經完成。 之後,授權用戶在獲得訪問SharePoint服務的問題出現
我們試圖通過我們收到 索賠獲得AccessToken
爲SharePoint我們試圖傳遞以下聲明:
nii":"trusted:adfs
nii":"urn:office:idp:forms:adfs201 //adfs201 - name of our ADFS service
upn:UserLogin
emailaddress:[email protected]
在那之後,我們叫的方法響應AccessToken
按照輸入的索賠
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);
然後,我們試圖讓ClientContext
,我們荷蘭國際集團的方法:
GetClientContextWithAccessToken(targetApplicationUri.ToString(), accessToken);
但我們得到了一個錯誤報告:
401 Unauthorized
ClientID
和IssureID
寫正確的,小寫
在那之後,我們決定從ADFS要求SecurityToken
的幫助username
和password
。收到它後,我們請求使用SecurityToken
在SharepointSTS中進行授權。然後,我們的應用程序獲得了Cookie Sharepoint,它被錨定到Sharepoint服務的查詢(添加到CookieContainer FedAuth
)。當激活ExecutingWebRequest += ClientContext_ExecutingWebRequest
時,發生上述情況。
但是爲此,應該使用username
和password
再次請求。
如果我們不SecurityToken
與用戶的數據提交username
和password
,然後ADFS迴應,其中的應用程序池啓動的名下。我們需要登錄到SharePoint的用戶的SecurityToken
。 我們還試圖發出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);
但反應不是我們所需要的SharePoint權限相同。
在端點的ADFS中,我們調整URL;我們需要SharePoint授權的SecurityToken (wresult)
通過POST查詢發送給它。問題是,我們無法在應用程序中接收到此查詢,因爲它在狀態302中廣播,並通過GET方法重定向到我們的應用程序,而我們的Cookie沒有SecurityToken
。
現在的問題是:我們怎麼能得到SecurityToken
的用戶登錄SharePoint?