2014-05-05 6 views
8

से 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 कैसे प्राप्त कर सकते हैं?

उत्तर

0

यहां एक सनकी पर जाकर, लेकिन ऐसा लगता है कि आपको दावा प्रदाता बनाने की आवश्यकता है, जो एक वर्ग है जो SPClaimProvider से विरासत में है।

शेयरपॉइंट में लोग पिकर, जो लोग आप लोगों और समूहों का चयन करने के लिए उपयोग करते हैं, वह नियंत्रण प्रदाता से इसके सभी लोग और समूह प्राप्त करते हैं।

बॉक्स, निम्नलिखित दावा प्रदाता मौजूद से

,

AllUsersClaimProvider FormsClaimsProvider ActiveDirectoryClaimsProvider

आप अतिरिक्त दावों संकल्प की जरूरत है, तो आप एक है, जो इतना बुरा नहीं है लिखने के लिए की है।

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

असल में, FillClaimsForEntity जहां एक पहचान प्रधानाचार्य को नए दावे जारी कर सकते हैं है।

दो रिजोल ओवरलोड्स है जहां आप देखते हैं कि इनपुट के लिए दावा मैच है या नहीं।

उदा। कहते हैं कि आप लोगों के पिकर में "बॉब" टाइप करते हैं। लोग पिकर तब खेत में पंजीकृत प्रत्येक दावे प्रदाता पर संकल्प (स्ट्रिंग इनपुट ...) को कॉल करने के लिए SPClaimsOperationManager * (सटीक वर्तनी भूल जाते हैं) का उपयोग करता है।

तो कहें कि हम फॉर्म दावा प्रदाता के बारे में बात कर रहे हैं। यह जांचने के लिए जांच करेगा कि क्या कोई उपयोगकर्ता उपयोगकर्ता नाम या ईमेल पता वाला बॉब है। प्रत्येक उपयोगकर्ता मैपिंग बॉब के लिए यह एक पिकर इकाई बनायेगा और बॉब इत्यादि के साथ FormsLogonUser को इसका दावा प्रकार सेट करेगा और यह प्रत्येक को परिणाम में जोड़ देगा।

तो जब यह हो जाता है, तो आप या तो बॉब इन द पीपल पिकर को चुनने के रूप में देखेंगे, या आप बॉब को एक लाल अंडरलाइन के साथ देखेंगे जिसका अर्थ है कि वे कई मैचों थे और आपको इसे चुनना होगा।

ऐसा लगता है कि आपको लोगों को अपने नए दावों के साथ काम करने में सक्षम बनाने के लिए एक बनाने की आवश्यकता है।

एक बार आपके पास दावा प्रदाता बनने और पंजीकृत होने के बाद, आप लोगों के पिकर का उपयोग अपने दावों का उपयोग करके साइट तक पहुंच प्रदान करने के लिए कर सकते हैं।

उदाहरण के लिए, मैंने एक बार दावा प्रदाता बनाया जिसने उपयोगकर्ताओं द्वारा खरीदे गए उत्पादों के आधार पर दावों को जारी किया।

इसलिए मैंने दावा किया कि "http://blah.com/schema/claims/product" (यह कोई अनूठी स्ट्रिंग हो सकती है जिसे आप चाहते हैं) और मान "pd.1234.0" जैसी चीजें थीं। अब FillClaimsForEntities में मैंने अपने सभी उत्पादों को प्राप्त करने के लिए हमारे डेटाबेस में इकाई पैरामीटर पर उपयोगकर्ता को देखा। फिर मैंने प्रत्येक उत्पाद के लिए एक उत्पाद दावा बनाया और उन्हें दावों की सूची में जोड़ा।

फिर संकल्प में मैं यह देखने के लिए देखता हूं कि कोई उत्पाद आईडी या डिस्प्ले नाम के साथ मौजूद है, जो संकल्प इनपुट को गणित करता है और अगर ऐसा होता है तो एक पिकर इकाई बनाते हैं।

खोज में वही बात।

फिर मैं अपने उत्पाद पृष्ठों में गया और लोगों के पिकर का उपयोग करके उस उत्पाद के दावे वाले किसी भी व्यक्ति को पृष्ठ तक पहुंच प्रदान की। "फॉर्म प्रमाणीकरण में भूमिका लेने जैसे काम करता है" तरह।

इसके अलावा आप दावों की विरासत के लिए समर्थन कोड भी दे सकते हैं और आप प्रत्येक दावे प्रकार के लिए काम कर रहे प्रत्येक दावा प्रकार के लिए 1 पेड़ में पेड़ कर सकते हैं।

उदा। "बॉब" एक व्यक्ति, एक किताब, और एक प्रबंधक वापस लाता है। आपके पास 3 विरासत, 1 लोगों के लिए, किताबों के लिए 1, प्रबंधकों के लिए 1 आदि हो सकते हैं और उस पेड़ में उस प्रकार के दावों को दिखाया जा सकता है।

मैंने इसे एक कदम आगे बढ़ाया और एक एक्सेस अस्वीकृत हैंडलर बनाया ताकि अगर किसी उत्पाद को उस उत्पाद में शामिल न होने के कारण इनकार कर दिया गया हो, तो उसने उन्हें उन उत्पादों को खरीदने वाले पृष्ठ पर रीडायरेक्ट कर दिया।

संबंधित मुद्दे