से SharePoint कुकी प्राप्त करने के लिए हम एक शेयरप्वाइंट आवेदन कोड प्रदाता की मेजबानी की, का उपयोग कर प्रमाण पत्र के रूप में यह विस्तार, और हमारे MVC परियोजना यह इस सभी का विस्तार करें के लिए एक ही IIS पर शेयरप्वाइंट विस्तार किया गया था लंगर।शेयरप्वाइंट प्रमाणीकरण। कैसे ADFS
कार्य # 1: उपयोगकर्ता एक शेयरपॉइंट में लॉग इन करता है, हमारे आवेदन को लॉन्च करता है; आवेदन किसी भी प्राधिकरण के अनुरोध के बिना शुरू होता है और उपयोगकर्ता शेयरप्वाइंट से यह में लॉग इन
टास्क # 2 हो जाता है:। तो शेयरप्वाइंट सेवा अनुरोध के लिए आवश्यक है, एक ही उपयोगकर्ता नाम के तहत शेयरप्वाइंट में हमारे आवेदन लॉग उपयोगकर्ता शेयरप्वाइंट में लॉग इन किया।
हमने कोशिश की:
1) प्रदाता द्वारा होस्ट किए गए एप्लिकेशन के ऊपर का निर्माण, यह हमारी MVC लेखन, एक आत्म गायन प्रमाण पत्र बनाने, का समायोजन उच्च भरोसा शेयरप्वाइंट साइट और हमारे MVC के बीच।
हम मिला: हमारे MVC Windows प्रमाणीकरण का उपयोग करता है, तो जब हमारे आवेदन को स्थानांतरित करते हैं, तो उपयोगकर्ता नाम और पासवर्ड फिर से अनुरोध कर रहे हैं; जब उन्हें प्रवेश करने, हम GetS2SClientContextWithWindowsIdentity
पद्धति का उपयोग करके TokenHelper
के माध्यम से ClientContext
मिल सकता है।
तो Windows प्रमाणीकरण अक्षम है, तो उपयोगकर्ता अनुरोध में लॉग ऑन है नहीं, और इस विधि अपवाद जवाब देता है कि उपयोगकर्ता के लॉग इन नहीं है।
2) हम स्थापित किया है और समायोजित ADFS, कॉन्फ़िगर शेयरप्वाइंट ADFS के साथ काम करने के लिए, शेयरप्वाइंट और Relaying पार्टी न्यास में हमारे आवेदन के पते (Identifiers and
में WS-Federtation` निष्क्रिय Endpoints) ने लिखा है
हम मिला: SharePoint में एक उपयोगकर्ता के लॉग, और जब हमारे आवेदन करने के लिए स्थानांतरित करने, ला tter उपयोगकर्ता डेटा (दावे)
इस प्रकार, पहला काम से छुट्टी दे दी गई है हो जाता है। उसके बाद, अधिकृत उपयोगकर्ता के तहत शेयरप्वाइंट सेवाओं तक पहुँच पाने की एक समस्या पैदा हुई
हम दावा हम प्राप्त के माध्यम से शेयरप्वाइंट के लिए AccessToken
प्राप्त करने की कोशिश हम निम्नलिखित दावों को हस्तांतरण करने की कोशिश की:
nii":"trusted:adfs
nii":"urn:office:idp:forms:adfs201 //adfs201 - name of our ADFS service
upn:UserLogin
emailaddress:[email protected]
उसके बाद, हम
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);
फिर एक विधि में प्रवेश का दावा अनुसार AccessToken
जवाब कहा जाता है, हम ClientContext
पाने की कोशिश की, हमें विधि ing:
GetClientContextWithAccessToken(targetApplicationUri.ToString(), accessToken);
लेकिन हम एक त्रुटि रिपोर्ट मिल गया:
401 Unauthorized
ClientID
और IssureID
सही लिखा गया है, लोअरकेस
उसके बाद, हम मदद से ADFS से SecurityToken
का अनुरोध करने का निर्णय लिया username
और password
का। इसे प्राप्त करने के बाद, हमने SecurityToken
का उपयोग करके SharepointSTS में प्राधिकरण का अनुरोध किया। फिर, हमारे आवेदन को कुकी शेयरपॉइंट मिला, जो शेयरपॉइंट सेवाओं पर क्वेरी (CookieContainer FedAuth
में जोड़ा गया) के लिए लगाया गया था। ExecutingWebRequest += ClientContext_ExecutingWebRequest
सक्रिय करते समय, ऊपर उल्लिखित होता है।
लेकिन इस के लिए, एक का उपयोग करना चाहिए username
और password
एक बार फिर से अनुरोध किया जा करने के लिए।
यदि हम username
और password
सबमिट नहीं करते हैं, तो एडीएफएस उपयोगकर्ता के डेटा के साथ SecurityToken
के साथ प्रतिक्रिया करता है, जिसके तहत एप्लिकेशन पूल शुरू किया गया था। और हमें उपयोगकर्ता के SecurityToken
की आवश्यकता है जो SharePoint में लॉग इन है। हम भी 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 प्राधिकरण के लिए आवश्यक नहीं था।
एंडपॉइंट्स में एडीएफएस में, हम यूआरएल समायोजित करते हैं; वह बहुत SecurityToken (wresult)
हमें POST क्वेरी द्वारा SharePoint प्रमाणीकरण को भेजने की आवश्यकता है। समस्या यह है कि हम इस क्वेरी को एप्लिकेशन में प्राप्त नहीं कर सकते क्योंकि इसे स्थिति 302 में प्रसारित किया गया है और हमारे कुकी के साथ SecurityToken
के बिना, GET विधि द्वारा हमारे एप्लिकेशन पर रीडायरेक्ट किया गया है।
सवाल यह है: हम SharePoint में लॉग इन किए गए उपयोगकर्ता के SecurityToken
कैसे प्राप्त कर सकते हैं?