2011-11-09 9 views
6

में लॉग इन है, मैं किसी भी माध्यम से SharePoint विशेषज्ञ नहीं हूं, और मुझे इस पर सही जानकारी खोजने में वास्तव में कठिन समय हो रहा है। कृपया मदद करें!SharePoint 2010 उपयोगकर्ता के लिए दावाों की दोबारा गणना करें, जबकि उपयोगकर्ता अभी भी

मैं एक स्वीकार कर लेंगे SPFederationAuthenticationModule.SetPrincipalAndWriteSessionToken के लिए एक कॉल प्रवेश बाहर वर्तमान उपयोगकर्ता के बिना टोकन पर दावे पुनर्गणना के लिए के साथ स्थापित पैदा करने के लिए एक तरह से की जरूरत है। क्या इसे करने का कोई तरीका है?

कारण है कि मैं इस पूछ रहा हूँ पर कुछ पृष्ठभूमि:

हम अपने कस्टम SharePoint 2010 वेब अनुप्रयोग पर authN/Z के लिए एक कस्टम भूमिका & सदस्यता प्रदाता का उपयोग करें। मुख्य ऐप डेटाबेस में उपयोगकर्ता की स्थिति के आधार पर उपयोगकर्ता के लिए गतिशील रूप से जेनरेट की गई भूमिका नाम क्यों बनाते हैं (जो जटिल हैं) के विवरण में शामिल किए बिना; ये भूमिकाएं उपयोगकर्ता के लिए अनुमतियों का प्रतिनिधित्व करती हैं और ऐप में साइट्स और साइट संग्रहों तक उपयोगकर्ता की पहुंच निर्धारित करने के लिए SharePoint के अंदर उपयोग की जाती हैं।

उपयोगकर्ता के लिए अपनी अनुमति बदलने के लिए हमारे ऐप के भीतर तरीके हैं, जो प्रभावी रूप से भूमिका प्रदाता के माध्यम से नई भूमिकाएं जोड़ते हैं, जिससे उपयोगकर्ता ऐप के भीतर अतिरिक्त पहुंच प्रदान करता है। जिस समस्या में हम चल रहे हैं वह यह है कि दावा आधारित लेख जिसे हम SP2010 प्रीकंप्यूट्स लॉगिन पर अनुमतियों का उपयोग करने के लिए मजबूर हैं और सत्र टोकन में उन अनुमतियों को एन्कोड करते हैं - प्रभावी रूप से हमें लॉग आउट करने और लॉग इन करने के लिए कहने के लिए मजबूर करते हैं इससे पहले कि वे अपनी नई अनुमति प्राप्त कर सकें। यह उपयोगिता के सभी प्रकार के मुद्दों को बना रहा है, इसलिए मेरा प्रश्न है।

क्या उपयोगकर्ता को लॉग आउट किए बिना सत्र टोकन को प्रोग्रामेटिक रूप से पुन: सम्मिलित करने का कोई तरीका है?

या क्या हम गलत पेड़ को भड़क रहे हैं? मेरी सामान्य खुश एएसपी.नेट भूमि में मैं फॉर्म ऑथ का उपयोग करता हूं, जो लॉगिन के बजाए प्रत्येक अनुरोध पर प्राधिकरण की गणना करता है। दुर्भाग्यवश, यह SP2010 में एक विकल्प नहीं प्रतीत होता है, और इस समय मैं शेयरपॉइंट के साथ फंस गया हूं। क्या कोई और कार्य है जिसे हम आगे बढ़ा सकते हैं?

+0

नहीं लगता है कि मैं इस समस्या को समझने - क्या मैं इस http://msdn.microsoft.com/en-us/library/ee557572.aspx के अनुसार आप एक नया SecurityToken बनाने के द्वारा दावों पुनर्गणना कर सकते हैं इकट्ठा से (एक ही उपयोगकर्ता/पीडब्ल्यू - अलग आईडी) ... क्या यह आप के बाद क्या है? अन्यथा विस्तृत करें ... – Yahia

+0

@ याहिया हां, यह वही है जो मैं बाद में हूं।लेकिन सुरक्षा टोकन को नए करने के लिए उपयोगकर्ता के पासवर्ड की आवश्यकता होती है - कुछ ऐसा जो मैं सिर्फ झूठ नहीं बोलता। मैं उपयोगकर्ता को उनके पासवर्ड के लिए पूछ सकता हूं, लेकिन यह उन्हें लॉग आउट करने और उन्हें वापस लॉग इन करने के बराबर होगा। मैं सत्र में पासवर्ड रख सकता हूं, लेकिन यह बेहद असुरक्षित होगा। पासवर्ड की आवश्यकता के बिना ऐसा करने का एक तरीका होना चाहिए। – Randolpho

+0

क्या आपने 'नवीनीकरण' में चेक किया है (http://msdn.microsoft.com/en-us/library/ms551886.aspx देखें) के बाद 'ValidateToken'' पर कॉल करें? अगर आपको जो चाहिए वह नहीं करता है तो मुझे संदेह है कि आपको या तो अपना कस्टम सिक्योरिटी टोकन/प्रदाता इत्यादि लिखना होगा या पीडब्लू को इन-मेमोरी के आसपास रखना होगा (जो मैं मानता हूं कि यह अच्छा नहीं है!)। – Yahia

उत्तर

5

ठीक है, @ याहिया के लिंक से प्रेरित काफी अनुसंधान के बाद, मैं a blog post में मेरी समस्याओं का जवाब खोज की। एक जादू की तरह काम किया। मैं एक सिंहावलोकन नीचे दे देंगे, मामले में कड़ी कभी टूट जाता है:

विंडोज पहचानें फाउंडेशन के SessionAuthenticationModule, जो SharePoint 2010 प्रमाणन ढांचे के रूप में प्रयोग किया जाता है, एक गंधा छोटे घटना है कि आप SessionSecurityTokenReceived बुलाया हुक कर सकते हैं, जिस पर कहा जाता है है हर अनुरोध की शुरुआत। इस घटना को जोड़कर, मैं उपयोगकर्ता को प्रमाण-पत्र दर्ज करने के लिए मजबूर किए बिना प्राधिकरण नवीनीकरण का अनुरोध करने के लिए SharePoint को मजबूर कर सकता हूं।

कोड सीधा और मीठा होता है:

var sam = sender as SessionAuthenticationModule; 
var logonWindow = SPSecurityTokenServiceManager.Local.LogonTokenCacheExpirationWindow; 
var newValidTo = DateTime.UtcNow.Add(logonWindow); 
e.SessionToken = sam.CreateSessionSecurityToken(
    e.SessionToken.ClaimsPrincipal, 
    e.SessionToken.Context, 
    e.SessionToken.ValidFrom, 
    newValidTo, 
    e.SessionToken.IsPersistent); 
e.ReissueCookie = true; 

मैं इसे परीक्षण किया है, और दृष्टिकोण निश्चित रूप से काम करता है, लेकिन वहाँ कमियां हैं: से

  1. कॉल CreateSessionToken करने की जरूरत मौजूदा डेटा वर्तमान सत्र टोकन, जो ऐसा प्रतीत होता है मैं केवल घटना से ही प्राप्त कर सकता हूं। इसका मतलब है कि यह दृष्टिकोण केवल नए अनुरोध के संदर्भ में ही किया जा सकता है। चूंकि के लिए घटना की आग हर अनुरोध और मैं केवल कुछ निश्चित परिस्थितियों में अधिकार का ताज़ा करने के लिए चाहता हूँ, मुझे प्रमाणन ताज़ा करने के लिए एक संकेत के लिए प्रत्येक अनुरोध का परीक्षण करने के लिए मजबूर कर रहा हूँ। सबसे आसान तरीका एक जादू यूआरएल बनाना है, जैसे कि "/ refreshToken? RedirectUrl = {url}" जिसे आप इवेंट हैंडलर में जांचते हैं। जब ऑथ अपडेट किया गया है और टोकन को रीफ्रेश करने की आवश्यकता है तो बस इस यूआरएल पर रीडायरेक्ट करें।
  2. घटना Hooking समस्याग्रस्त है - आप इसे स्थिर नहीं कर सकते क्योंकि मॉड्यूल जब स्थिर कंस्ट्रक्टर्स निर्माण कर रहे हैं मौजूद नहीं है। आखिरकार, आप कस्टम HttpModule या global.asax में ऐसा करने से सबसे अच्छे हैं - दोनों को संसाधनों को अपडेट करने की आवश्यकता है जिन्हें .WSP फ़ाइल परिनियोजन (web.config या global.asax फ़ाइल) के माध्यम से स्पर्श नहीं किया जा सकता है, इसलिए या तो दृष्टिकोण तैनाती के मुद्दों का कारण बनता है, कम से कम पहली तैनाती। मैंने global.asax मार्ग पर जाना चुना।

सभी में, एक संतोषजनक हैक। कम से कम कामकाज के साथ काम पूरा हो गया।

+0

मैंने इसका इस्तेमाल http://sharepoint.stackexchange.com/questions/75675/sts-token-lifetime-for-external-claims-eg-azure-acs/76168#76168 का उत्तर देने के लिए किया - मैं इसे यहां संदर्भित करता हूं क्योंकि कोड है थोड़ी अधिक फिसल गई, और मेरे पास एक अलग उपयोग केस था, लेकिन कोई जवाब आपके उत्तर को समझते समय उपयोगी हो सकता है। –

2

मैं कई संभावनाएं देखें:

  • समूहों/भूमिकाओं गतिशील

  • उपयोग RenewToken द्वारा ValidateToken
    पीछा जोड़ने के लिए क्या यह वास्तव में आप क्या चाहते हैं करता है SPRoleAssignment और SPGroupCollection respecitve SPUser पर उपयोग करने का प्रयास इस पर निर्भर करता है कि कैशिंग को कैसे कार्यान्वित किया जाता है (यानी नवीकरण/वैध रूप से कैश किए गए दावों को अमान्य कर देता है)

  • पासवर्ड को चारों ओर रखें, एक नया टोकन जारी करें (उसी उपयोगकर्ता/पीडब्ल्यू के साथ, लेकिन नई आईडी!) तो ValidateToken
    मुझे लगता है कि यह सबसे आसान विकल्प है लेकिन साथ ही एक सुरक्षा दुःस्वप्न (यानी। बुरा अभ्यास)!

  • कॉल Authenticate आप एक दावे के लिए
    जाँच करने के लिए क्या यह काम करता है चाहता हूँ जब भी अपने कस्टम प्रदाता पर निर्भर करता ... अगर यह काम करता है यह, हालांकि प्रदर्शन खर्च होंगे ...

  • लागू अपने custom SecurityToken (और providerand ...)
    यह वही करेगा जो आप चाहते हैं लेकिन इसका अर्थ है lots of work

अन्य सहयोगी संसाधन शामिल हैं:

+0

उत्तर के लिए बहुत बहुत धन्यवाद। मैं आपके सुझावों की जांच करूंगा और आपको बताऊंगा कि मुझे क्या पता चला है। – Randolpho

+0

ठीक है, आपके कुछ लिंक द्वारा प्रचारित शोध के बाद, मुझे जवाब मिला। आपके सुझावों में से कोई भी काम नहीं करता है, इसलिए मैं आपका जवाब स्वीकार नहीं कर रहा हूं, लेकिन मैं आपको आपकी मदद के लिए अपना उपहार दूंगा। मैं इसकी बहुत सराहना करता हूं। मैं पोस्ट करूंगा कि मैं एक अलग उत्तर में समस्या को कैसे हल करता हूं। – Randolpho

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