2012-05-29 12 views
8

मैं एक प्रणाली ADFS और दावों के साथ काम करने का निर्माण करने की कोशिश कर रहा हूँ नहीं बना सकते। फिलहाल, यह सिर्फ एक "खिलौना" कार्यान्वयन है।बनाना प्रतिनिधिमंडल टोकन - एक SecurityTokenService

मैंने एक बहुत ही सरल एमवीसी वेब एप्लिकेशन बनाया है, इसे एक एडीएफएस 2.0 सर्वर से बात करने के लिए विजुअल स्टूडियो में "पहचान और एक्सेस ..." विज़ार्ड का उपयोग करके सेट अप किया है, और इसे आईआईएस सर्वर पर तैनात किया है। सभी ठीक काम करते हैं, और मैं प्राप्त दावों की जांच और सूची कर सकता हूं।

अगला चरण एक वेब एपीआई आधारित आरईएसटी सेवा (एमवीसी अनुप्रयोग पर निर्भर करने वाली बैक-एंड सेवाओं का प्रतिनिधित्व करने) का निर्माण करना है, इसलिए मैं प्रमाण-पत्र उस बैक-एंड सर्वर पर पास करना चाहता हूं ताकि वह उपयुक्त प्राधिकरण निर्णय ले सकते हैं।

तो पहला कदम मेरे लिए प्रतिनिधिमंडल टोकन बनाने के लिए है (और फिर, उम्मीद है कि, बाकी कॉल करने के लिए HttpClient कक्षा के संदर्भ में इसके साथ क्या करना है)। मैं इस मिल गया है:

//We need to take the bootstrap token and create an appropriate ActAs token 
var rst = new RequestSecurityToken 
{ 
    AppliesTo = new EndpointReference("https://other-iis.example.com/Rest"), 
    RequestType = RequestTypes.Issue, 
    KeyType = KeyTypes.Symmetric, 
    ActAs = new SecurityTokenElement(((BootstrapContext)((ClaimsIdentity)User.Identity).BootstrapContext).SecurityToken) 
}; 

var sts = new SecurityTokenService(); //This line isn't valid 
var resp = sts.Issue(System.Threading.Thread.CurrentPrincipal as ClaimsPrincipal, rst); 

लेकिन, मुद्दा यह है कि SecurityTokenService सार है। मैं किसी भी प्रकार या तो System.IdentityModel है और न ही System.IdentityModel.Services में इस वर्ग से प्राप्त नहीं मिल रहा है, और इसके बाद के संस्करण ADFS सर्वर जो मैं कुछ बिंदु पर प्रदान करने के लिए स्पष्ट रूप से की आवश्यकता होगी के लिए किसी भी संदर्भ शामिल नहीं है।

बेशक, मैं पूरी तरह से गलत मार्ग भी नीचे जा रहा हूं, या सिर्फ मामूली ठोकर खा रहा हूं और दूरी में बहुत अधिक लूमिंग नहीं देख रहा हूं, इसलिए उस पर कोई सलाह भी सराहना की जाएगी।


मैं उदाहरण के लिए, Identity Delegation Scenario के लिए, देखा है, लेकिन वह CreateChannelActingAs है, जो मुझे नहीं लगता कि काम करने के लिए जब मैं एक आराम सेवा करने के लिए बात कर रहा हूँ वाला है का उपयोग करता है (यह या होगा?), और यह भी .NET 4.5 पर लागू प्रतीत नहीं होता है।

उत्तर

3

मैं कैशिंग के लिए एक ADFS 2.0 से टोकन का अनुरोध कर रहा हूँ और DisplayToken को देख के साथ अपने भी संभव अनुमान लगा im। शायद यह आपको शुरू करने में मदद कर सकता है।

public SecurityToken GetToken(out RequestSecurityTokenResponse rstr) 
    { 
     Console.WriteLine("Connecting to STS..."); 

     WSTrustChannelFactory factory = null; 

     try 
     { 
      if (_useCredentials) 
      { 
       // use a UserName Trust Binding for username authentication 
       factory = 
        new WSTrustChannelFactory(
         new UserNameWSTrustBinding(SecurityMode.TransportWithMessageCredential), 
         "https://<adfs>/adfs/services/trust/13/UsernameMixed"); 

       factory.TrustVersion = TrustVersion.WSTrust13; 

       // Username and Password here... 
       factory.Credentials.UserName.UserName = "username"; 
       factory.Credentials.UserName.Password = "password"; 
      } 
      else 
      { 
       // Windows authentication over transport security 
       factory = new WSTrustChannelFactory(
        new WindowsWSTrustBinding(SecurityMode.Transport), 
        "https://<adfs>/adfs/services/trust/13/windowstransport") { TrustVersion = TrustVersion.WSTrust13 }; 
      } 

      var rst = new RequestSecurityToken 
          { 
           RequestType = RequestTypes.Issue, 
           AppliesTo = SvcEndpoint, 
           KeyType = KeyTypes.Symmetric, 
           RequestDisplayToken = true 
          }; 

      Console.WriteLine("Creating channel for STS..."); 

      IWSTrustChannelContract channel = factory.CreateChannel(); 

      Console.WriteLine("Requesting token from " + StsEndpoint.Uri); 
      SecurityToken token = channel.Issue(rst, out rstr); 
      Console.WriteLine("Received token from " + StsEndpoint.Uri); 

      return token; 
     } 
     finally 
     { 
      if (factory != null) 
      { 
       try 
       { 
        factory.Close(); 
       } 
       catch (CommunicationObjectFaultedException) 
       { 
        factory.Abort(); 
       } 
      } 
     } 
    } 

आप अपने ADFS 2.0 में UsernameMixed Endpoint Acivate को आप इसका इस्तेमाल करना चाहते हैं तो हो सकता है और भूल नहीं है बाद में सेवा को पुनः आरंभ करने:

यहाँ के साथ मैं यह कर सकते है!

1

msdn

से एक एसटीएस आप SecurityTokenService वर्ग से निकाले जाते हैं चाहिए बनाने के लिए। अपनी कस्टम कक्षा में, कम से कम, GetScope और GetOutputClaimsIdentity विधियों को ओवरराइड करना होगा।

+0

मैं एक एसटीएस लागू नहीं करना चाहता - मैं एडीएफएस से बात करना चाहता हूं और इसे एक प्रतिनिधिमंडल टोकन जारी करने के लिए प्राप्त करना चाहता हूं - मुझे ऐसा करने का कोई तरीका नहीं दिख रहा है। –

1

सुनिश्चित नहीं हैं कि इस आप कितना मदद मिलेगी, लेकिन आप एक SecurityTokenService बनाने के लिए नहीं करना पड़ेगा। आप नया टोकन यहाँ पैदा कर रहे हैं, और आपके आवेदन एसटीएस के रूप में कार्य करने की अपेक्षा की नहीं है - यह है कि क्या ई एफएस के लिए है।
आपका आवेदन केवल (अवधारणा MSDN से लिंक में वर्णित है आप अपने प्रश्न में प्रदान की)

इम अनुमान लगा एक अच्छा मौका जाल एपीआई होगा theres सेवा करने के लिए ई FS से प्राप्त टोकन प्रतिनिधि चाहिए इस रूप में अच्छी तरह suppor, के रूप में WCF पर इसके निर्माण किया है, और देखने के लिए http बिंदु से - कोई कारण नहीं यह अभ्यस्त एक WS-महासंघ/saml 2 टोकन का समर्थन theres।

संपादित करें:
This वीडियो (35 से शुरू होने: 00 + -) लागू करने के लिए आप के लिए क्या देख WS-महासंघ saml टोकन के माध्यम से, एक तरह से पता चलता है, मुझे लगता है कि,। एक SAML2 टोकन

+0

मुझे लगता है कि मैं खुद को बनाना नहीं चाहता हूं - लेकिन मैं प्रतिनिधिमंडल टोकन के लिए एडीएफएस को एक अनुरोध भेजना चाहता हूं - आदर्श रूप में मैं 'var sts = new someStsObject (adfsEndpointAddress) जैसे कुछ ढूंढ रहा हूं; var tokan = sts.Issue (rst); ', लेकिन अभी तक यह नहीं मिला है। –

+0

यह नहीं है कि यह कैसे काम करना चाहिए, अगर मैं इसे सही ढंग से समझता हूं; आपको प्रतिनिधिमंडल के लिए विज्ञापन एफएस अनुरोध नहीं भेजना चाहिए। आपको इसके खिलाफ प्रमाणीकरण करना होगा और एक टोकन प्राप्त करना होगा, जैसा कि आप एक सामान्य प्रवाह में करेंगे। फिर, आप प्राप्त उपभोक्ता को अगले उपभोक्ता को सौंप देते हैं, मानते हैं कि वह इस पर भरोसा करता है। आपको कोड की कोई भी पंक्ति एसटीएस के रूप में कुछ करने की ज़रूरत नहीं है। आईएसयू .. बीटीडब्ल्यू, [यह लिंक] देखें (http://leastprivilege.com/)। मैंने इसे सब कुछ नहीं पढ़ा, लेकिन ऐसा लगता है कि hes इसी तरह के मुद्दों पर काम करता है। – YavgenyP

+0

मैं जो कोशिश कर रहा हूं वह कुछ है [एडीएफएस 2.0 के साथ पहचान प्रतिनिधि] (http://technet.microsoft.com/en-us/library/adfs2-identity-delegation-step-by-step-guide (v = ws .10) .aspx), लेकिन मेरी बैक-एंड सेवा आरईएसटी है, डब्ल्यूसीएफ नहीं, इसलिए मैं 'CreateChannelActingAs', या किसी अन्य डब्ल्यूसीएफ सुविधाओं का उपयोग नहीं कर सकता। –

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