2015-11-11 10 views
6

मेरी कार्यान्वयन मैं में OpenID कनेक्ट सर्वर (पहचान सर्वर v3 +) का उपयोग कर रहा Asp.net MVC 5 एप्लिकेशन प्रमाणित करने (AngularJS सामने के अंत के साथ)ओपनआईडी कनेक्ट के लिए ओडब्ल्यूआईएन मिडलवेयर - कोड प्रवाह (प्रवाह प्रकार - प्राधिकरण कोड) दस्तावेज?

मैं (Open_ID स्कोप के साथ) OID कोड प्रवाह के लिए उपयोग करने के लिए योजना बना रहा हूँ क्लाइंट (आरपी) प्रमाणित करें। ओपनआईडी मिड-वेयर कनेक्ट करने के लिए, मैं ओविन (कटाना प्रोजेक्ट) घटकों का उपयोग कर रहा हूं।

कार्यान्वयन से पहले, मैं बैक-चैनल टोकन अनुरोध को समझना चाहता हूं, ओविन का उपयोग कर टोकन अनुरोध प्रक्रिया को रीफ्रेश करना चाहता हूं .. लेकिन मैं इस प्रकार के कार्यान्वयन के लिए कोई दस्तावेज नहीं ढूंढ पा रहा हूं (उपलब्ध उदाहरणों में से अधिकांश लागू प्रवाह का उपयोग करते हैं)।

मुझे लगता है मैं एक ऐसी ही एक Owin मिडलवेयर का उपयोग कर रहा हूँ आईडी सर्वर v3 यहाँ https://github.com/IdentityServer/IdentityServer3.Samples/tree/master/source

के लिए सामान्य कोड प्रवाह कार्यान्वयन के लिए नमूने मिल सकता है? क्या किसी के पास कोई संकेतक है?

उत्तर

17

ओपनआईडी कनेक्ट मिडलवेयर कोड प्रवाह का समर्थन नहीं करता है: http://katanaproject.codeplex.com/workitem/247 (हालांकि यह पहले ही एएसपी.नेट 5 संस्करण में तय है)।

दरअसल, केवल अंतर्निहित प्रवाह (id_token) आधिकारिक रूप से समर्थित है, और आपको response_mode=form_post एक्सटेंशन का उपयोग करना होगा। प्रमाणीकरण कोड प्रवाह का उपयोग करने का प्रयास केवल कॉलबैक के दौरान एक अपवाद फेंक दिया जाएगा, क्योंकि यह प्रमाणीकरण प्रतिक्रिया से (गायब) id_token निकालने में सक्षम नहीं होगा।

हालांकि सीधे समर्थित नहीं है, आप हाइब्रिड प्रवाह (code + id_token (+ token)) का भी उपयोग कर सकते हैं, लेकिन टोकन अनुरोध भाग को लागू करने के लिए यह आपके ऊपर निर्भर है। उदाहरण के लिए आप https://github.com/aspnet-contrib/AspNet.Security.OpenIdConnect.Server/blob/dev/samples/Nancy/Nancy.Client/Startup.cs#L82-L115 देख सकते हैं।

+3

इस ज्ञान में इतना ज्ञान पैक किया गया। यह आपको इन सभी दर्द बिंदुओं को खोजने के लिए समय लेना होगा। ओपी के लिए कॉलबैक * के दौरान * अपवाद को फेंक दिया जा रहा है: अपवाद आईडी आईडी को कॉल में वापस नहीं किया जा रहा है, यदि आप केवल 'कोड' प्रवाह (जो निश्चित रूप से डिज़ाइन द्वारा है) मांगते हैं। –

+1

@CrescentFresh दयालु शब्द धन्यवाद! असल में, मैंने ओआईडीसी मिडलवेयर में कुछ बार योगदान दिया है (उदाहरण के लिए, मैंने प्रतिक्रिया_मोड = क्वेरी समर्थन प्रस्तुत किया है) और मैं ओविन/कटाना और एएसपी.नेट 5 के लिए सर्वर समकक्ष विकसित करता हूं (https://github.com/aspnet -contrib/AspNet.Security.OpenIdConnect.Server), जो बताता है कि मैं ओआईडीसी से संबंधित प्रश्नों के साथ क्यों सहज महसूस करता हूं;) मैंने आपके परिशुद्धता को शामिल करने के लिए अपना उत्तर अपडेट किया, धन्यवाद! – Pinpoint

+0

क्या आप कृपया इस प्रश्न के साथ मेरी सहायता कर सकते हैं: https: //stackoverflow.com/questions/47096113/token-based-implementation-in-webapi-to-secure-endpoints –

0

पिनपॉइंट द्वारा उत्तर और टिप्पणी जवाब स्पॉट पर हैं। धन्यवाद!

लेकिन यदि आप NuGet पैकेज से दूर जाने के लिए तैयार हैं और इसके बजाय Microsoft.Owin.Security.OpenIdConnect के लिए संशोधित स्रोत कोड चलाएं तो आप form_post के साथ कोड (code) प्रवाह प्राप्त कर सकते हैं।

बेशक यह सब ओपन सोर्स प्रोजेक्ट की समस्याओं के लिए कहा जा सकता है लेकिन इसलिए मैंने सोचा कि मैं हिस्सा था कि यह एक विकल्प हो सकता है यह मेरे मामले में एक बड़ी बात के लिए एक त्वरित समाधान था।

मैंने https://github.com/aspnet/AspNetKatana से कोड डाउनलोड किया, मेरे समाधान में csproj जोड़ा और AuthenticateCoreAsync() में https://github.com/aspnet/AspNetKatana/blob/dev/src/Microsoft.Owin.Security.OpenIdConnect/OpenidConnectAuthenticationHandler.cs से लाइनों को हटा दिया।

आपको इसे बैकचैनल कॉल के साथ संयोजित करना होगा और फिर अधिसूचना के रूप में सेट करने के लिए अपना खुद का नया दावा Identity() बनाना होगा। प्रमाणीकरण टिकट।

// Install-Package IdentityModel to handle the backchannel calls in a nicer fashion 
AuthorizationCodeReceived = async notification => 
{ 
    var configuration = await notification.Options.ConfigurationManager 
      .GetConfigurationAsync(notification.Request.CallCancelled); 

    var tokenClient = new TokenClient(configuration.TokenEndpoint, 
      notification.Options.ClientId, notification.Options.ClientSecret, 
        AuthenticationStyle.PostValues); 
    var tokenResponse = await tokenClient.RequestAuthorizationCodeAsync(
     notification.ProtocolMessage.Code, 
     "http://localhost:53004/signin-oidc", 
     cancellationToken: notification.Request.CallCancelled); 

    if (tokenResponse.IsError 
      || string.IsNullOrWhiteSpace(tokenResponse.AccessToken) 
      || string.IsNullOrWhiteSpace(tokenResponse.RefreshToken)) 
    { 
     notification.HandleResponse(); 
     notification.Response.Write("Error retrieving tokens."); 
     return; 
    } 

    var userInfoClient = new UserInfoClient(configuration.UserInfoEndpoint); 
    var userInfoResponse = await userInfoClient.GetAsync(tokenResponse.AccessToken); 

    if (userInfoResponse.IsError) 
    { 
     notification.HandleResponse(); 
     notification.Response.Write("Error retrieving user info."); 
     return; 
    } 
    .. 
संबंधित मुद्दे