2015-07-13 9 views
10

में OAuth2 वेब एपीआई क्लाइंट को कैसे लिखें, हमने वेब एपीआई (आरईएसटी) का एक सेट विकसित किया है जो प्राधिकरण सर्वर द्वारा संरक्षित है। प्राधिकरण सर्वर ने क्लाइंट आईडी और क्लाइंट रहस्य जारी किया है। इन्हें एक्सेस टोकन प्राप्त करने के लिए उपयोग किया जा सकता है। संसाधन सर्वर (आरईएसटी एपीआई) के बाद की कॉल पर वैध टोकन का उपयोग किया जा सकता है।Asp.net एमवीसी

मैं एक वेब आधारित (Asp.net एमवीसी 5) क्लाइंट लिखना चाहता हूं जो एपीआई का उपभोग करेगा। क्या कोई नुजेट पैकेज है जिसे मैं डाउनलोड कर सकता हूं जो क्लाइंट OAuth2 प्रवाह को लागू करने में मेरी मदद करेगा? क्या कोई मुझे OAuth2 प्रवाह (एएसपीनेट एमवीसी में लिखा गया) के क्लाइंट कार्यान्वयन पर एक अच्छा उदाहरण के लिए निर्देशित कर सकता है?

अद्यतन मैं नीचे दिए गए कोड ब्लॉक का उपयोग टोकन पहुँच प्राप्त करने में सक्षम था, लेकिन क्या मैं चाहता हूँ एक "ग्राहक साख" OAuth 2 प्रवाह जहां मैं लॉगिन और पासवर्ड दर्ज करने के लिए नहीं है। कोड मैं अब है:

var request = new HttpRequestMessage(HttpMethod.Post, "http://server.com/token"); 
request.Content = new FormUrlEncodedContent(new Dictionary<string, string> { 
    { "client_id", "your client_id" }, 
    { "client_secret", "your client_secret" }, 
    { "grant_type", "client_credentials" } 
}); 

var response = await client.SendAsync(request); 
response.EnsureSuccessStatusCode(); 

var payload = JObject.Parse(await response.Content.ReadAsStringAsync()); 
var token = payload.Value<string>("access_token"); 

इंटरैक्टिव प्रवाह के लिए (प्राधिकरण कोड की तरह:

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     app.SetDefaultSignInAsAuthenticationType("ClientCookie"); 

     app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      AuthenticationMode = AuthenticationMode.Active, 
      AuthenticationType = "ClientCookie", 
      CookieName = CookieAuthenticationDefaults.CookiePrefix + "ClientCookie", 
      ExpireTimeSpan = TimeSpan.FromMinutes(5) 
     }); 

     app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions 
     { 
      AuthenticationMode = AuthenticationMode.Active, 
      AuthenticationType = OpenIdConnectAuthenticationDefaults.AuthenticationType,     
      SignInAsAuthenticationType = app.GetDefaultSignInAsAuthenticationType(), 
      ClientId = ConfigurationManager.AppSettings["AuthServer:ClientId"], 
      ClientSecret = ConfigurationManager.AppSettings["AuthServer:ClientSecret"], 
      RedirectUri = ConfigurationManager.AppSettings["AuthServer:RedirectUrl"], 
      Configuration = new OpenIdConnectConfiguration 
      { 
       AuthorizationEndpoint = "https://identityserver.com/oauth2/authorize", 
       TokenEndpoint = "https://identityserver.com/oauth2/token"           
      }, 

      //ResponseType = "client_credentials", // Doesn't work 
      ResponseType = "token", 

      Notifications = new OpenIdConnectAuthenticationNotifications 
      { 
       AuthenticationFailed = notification => 
       { 
        if (string.Equals(notification.ProtocolMessage.Error, "access_denied", StringComparison.Ordinal)) 
        { 
         notification.HandleResponse(); 

         notification.Response.Redirect("/"); 
        } 

        return Task.FromResult<object>(null); 
       }, 

       AuthorizationCodeReceived = async notification => 
       { 
        using (var client = new HttpClient()) 
        { 
         //var configuration = await notification.Options.ConfigurationManager.GetConfigurationAsync(notification.Request.CallCancelled); 
         String tokenEndPoint = "https://identityserver.com/oauth2/token"; 

         //var request = new HttpRequestMessage(HttpMethod.Post, configuration.TokenEndpoint); 
         var request = new HttpRequestMessage(HttpMethod.Post, tokenEndPoint); 
         request.Content = new FormUrlEncodedContent(new Dictionary<string, string> { 
          { OpenIdConnectParameterNames.ClientId, notification.Options.ClientId }, 
          { OpenIdConnectParameterNames.ClientSecret, notification.Options.ClientSecret }, 
          { OpenIdConnectParameterNames.Code, notification.ProtocolMessage.Code }, 
          { OpenIdConnectParameterNames.GrantType, "authorization_code" }, 
          { OpenIdConnectParameterNames.RedirectUri, notification.Options.RedirectUri } 
         }); 

         var response = await client.SendAsync(request, notification.Request.CallCancelled); 
         response.EnsureSuccessStatusCode(); 

         var payload = JObject.Parse(await response.Content.ReadAsStringAsync()); 

         // Add the access token to the returned ClaimsIdentity to make it easier to retrieve. 
         notification.AuthenticationTicket.Identity.AddClaim(new Claim(
          type: OpenIdConnectParameterNames.AccessToken, 
          value: payload.Value<string>(OpenIdConnectParameterNames.AccessToken))); 
        } 
       } 
      } 
     }); 


    } 
} 

उत्तर

15

ग्राहक साख प्रकार अनुदान का समर्थन करने के लिए, आपका सबसे अच्छा विकल्प शायद सीधे HttpClient उपयोग करने के लिए है प्रवाह), दो बेहतर दृष्टिकोण हैं:

  • यदि आपका प्राधिकरण सर्वर समर्थन करता है OpenID Connect ने (जो OAuth2 पर आधारित है), तो आप बस Owin/कटाना 3 माइक्रोसॉफ्ट द्वारा विकसित के लिए OpenID Connect ने मिडलवेयर उपयोग कर सकते हैं: https://www.nuget.org/packages/Microsoft.Owin.Security.OpenIdConnect/

  • OpenID Connect ने अपने प्राधिकरण सर्वर द्वारा समर्थित नहीं है, तो एक ही विकल्प बनाने के लिए है अपने अपने OAuth2 क्लाइंट मिडलवेयर। आप इस के अंतिम भाग पर एक नज़र डालें ताकि अधिक जानकारी के लिए जवाब कर सकते हैं: Registering Web API 2 external logins from multiple API clients with OWIN Identity

+0

मैं कुछ प्रगति की है और टोकन पहचान सर्वर से वापस प्राप्त करने में सक्षम था। लेकिन मैं जो चाहता हूं वह "क्लाइंट क्रेडेंशियल" प्रवाह है, जहां मुझे कोई लॉगिन और पासवर्ड दर्ज करने की आवश्यकता नहीं होगी। टोकन क्लाइंट आईडी और क्लाइंट सीक्रेट के आधार पर जारी किया जाना चाहिए। किसी भी तरह से मैं इसे कॉन्फ़िगर करने में सक्षम नहीं था। मैंने अपने वर्तमान कोड के साथ सवाल अपडेट किया है। – TejSoft

+1

अब यह एक अलग सवाल है जिसे मैं डरता हूं। आपका मूल प्रश्न, हालांकि अपर्याप्त शर्तों का उपयोग करते हुए, सुझाव दिया गया है कि आप प्राधिकरण कोड प्रवाह का उपयोग कर रहे थे: "इन्हें प्राधिकरण कुंजी प्राप्त करने के लिए उपयोग किया जा सकता है, जिसे बदले में एक्सेस टोकन प्राप्त करने के लिए उपयोग किया जा सकता है"। कटाना 3 के लिए विकसित ओआईडीसी मिडलवेयर संसाधन मालिक पासवर्ड प्रमाण-पत्र प्रवाह या क्लाइंट प्रमाण-पत्र प्रवाह जैसे गैर-इंटरैक्टिव प्रवाह का समर्थन नहीं करता है। आपको 'grant_type = client_credentials' के साथ सीधे 'HttpClient' का उपयोग करना होगा। आप किस प्राधिकरण सर्वर का उपयोग कर रहे हैं? – Pinpoint

+0

हां, जब मैंने इसे कार्यान्वित करना शुरू किया, तो चीजें स्पष्ट हो गईं। मैं एक जावा आधारित पहचान सर्वर का उपयोग कर रहा हूं जिसे डब्ल्यूएस 02 कहा जाता है। यदि कटाना 3 का उपयोग "क्लाइंट क्रेडेंशियल्स" के लिए नहीं किया जा सकता है, तो क्या आप किसी अन्य नुजेट पैकेज की सलाह देते हैं? कोई उदाहरण? – TejSoft

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