43

के साथ एएसपी.नेट एमवीसी 4 वेब एपीआई प्रमाणीकरण मेरे पास वेब एपीआई का उपयोग कर एएसपी.नेट एमवीसी 4 प्रोजेक्ट है। नियंत्रक पर मैंने कक्षा को [प्राधिकृत] विशेषता का उपयोग करके प्राधिकरण की आवश्यकता के लिए सेट किया है। प्रमाणीकरण के लिए मैं एएसपी.NET सदस्यता प्रदाता का उपयोग कर रहा हूं और अपना वेब। कॉनफिग "फॉर्म" प्रमाणीकरण का उपयोग करने के लिए सेट है। यहां वह जगह है जहां मैं फंस गया हूं:सदस्यता प्रदाता

सब कुछ ठीक काम कर रहा है जब तक कि मैं एपीआई का परीक्षण करने के साथ नहीं कर पाता हूं और मैं नियंत्रक को [प्राधिकृत] विशेषता के साथ सुरक्षित करना चाहता हूं ताकि मैं अपने उपयोगकर्ताओं के खिलाफ प्रमाणीकरण का परीक्षण शुरू कर सकूं सदस्यता प्रदाता इसलिए मैं फ़िडलर ऊपर आग और एक ही कॉल प्राधिकरण जोड़ने बनाने: तो जैसे मेरी सदस्यता प्रदाता से पासवर्ड:

enter image description here

प्रतिक्रिया मैं 401 अनधिकृत है और "प्रमाणीकरण" के तहत एक उपयोगकर्ता नाम के साथ साथ बुनियादी विशेषता मुझे "कोई डब्ल्यूडब्ल्यूडब्ल्यू-प्रमाणीकरण हैडर मौजूद नहीं है।" तब मुझे एहसास हुआ कि एपीआई एक SHA1 एन्कोडेड कुंजी की तलाश में है। तो मैं एक खोज से एक SHA1 जनरेटर ऊपर आग और अपना उपयोगकर्ता नाम के लिए एक हैश मिलती है: पासवर्ड और इतने की तरह मेरे अनुरोध हेडर अद्यतन:

enter image description here

यह या तो काम नहीं करता है और मैं एक ही परिणाम मिलता है। इसके अलावा मुझे सर्वर के साथ अपना उपयोगकर्ता नाम/पासवर्ड डीकोड करने के लिए उपयोग करने के लिए कुछ प्रकार की "साझा गुप्त कुंजी" की आवश्यकता है।

तो मेरे सवालों का:

  1. मैं कैसे सर्वर से इस कुंजी मिलता है (या इस मामले वर्चुअल IIS में वी.एस. 2012 बंद चल रहा है)।
  2. मैं एएसपी.NET सदस्यता प्रदाता से उपयोगकर्ता नाम/पासवर्ड का उपयोग करके फिडलर में प्रमाणीकृत कॉल करने के लिए इसका उपयोग कैसे करूं।
  3. एक ही कॉल (सी # डब्ल्यूपीएफ ऐप) बनाने के लिए मैं अपने क्लाइंट एप्लिकेशन में इसका उपयोग कैसे करूं।
  4. क्या यह सबसे अच्छा अभ्यास है जब मेरे HTTP कॉल पर एसएसएल के साथ संयुक्त हो? यदि नहीं है तो क्या है?

अग्रिम धन्यवाद!

उत्तर

67

आप एसएसएल के साथ basic authentication का उपयोग कर सकते हैं। सर्वर साइड पर हम एक कस्टम delegating हैंडलर जो memebership प्रदाता है कि हम पंजीकृत पूछताछ की प्रमाणिकता की पुष्टि करेंगे लिख सकता है, और वैध है, भूमिकाओं को पुनः प्राप्त और मौजूदा प्रिंसिपल सेट:

public class BasicAuthenticationMessageHandler : DelegatingHandler 
{ 
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     var authHeader = request.Headers.Authorization; 

     if (authHeader == null) 
     { 
      return base.SendAsync(request, cancellationToken); 
     } 

     if (authHeader.Scheme != "Basic") 
     { 
      return base.SendAsync(request, cancellationToken); 
     } 

     var encodedUserPass = authHeader.Parameter.Trim(); 
     var userPass = Encoding.ASCII.GetString(Convert.FromBase64String(encodedUserPass)); 
     var parts = userPass.Split(":".ToCharArray()); 
     var username = parts[0]; 
     var password = parts[1]; 

     if (!Membership.ValidateUser(username, password)) 
     { 
      return base.SendAsync(request, cancellationToken); 
     } 

     var identity = new GenericIdentity(username, "Basic"); 
     string[] roles = Roles.Provider.GetRolesForUser(username); 
     var principal = new GenericPrincipal(identity, roles); 
     Thread.CurrentPrincipal = principal; 
     if (HttpContext.Current != null) 
     { 
      HttpContext.Current.User = principal; 
     } 

     return base.SendAsync(request, cancellationToken); 
    } 
} 

हम तो इस हैंडलर रजिस्टर Application_Start में:

[Authorize] 
public class ValuesController : ApiController 
{ 
    public string Get() 
    { 
     return string.Format("Hello {0}", User.Identity.Name); 
    } 
} 
:

GlobalConfiguration.Configuration.MessageHandlers.Add(
    new BasicAuthenticationMessageHandler() 
); 

अब हम एक एपीआई नियंत्रक उस के साथ [अधिकृत] सजाया किया जाएगा सुनिश्चित करना है कि केवल प्रमाणीकृत उपयोगकर्ताओं उसके कार्यों का उपयोग कर सकते विशेषता हो सकता था

ठीक है, अब हम एक नमूना ग्राहक को देखो:

using System; 
using System.Net; 
using System.Net.Http; 
using System.Net.Http.Headers; 
using System.Text; 

class Program 
{ 
    static void Main() 
    { 
     // since for testing purposes I am using IIS Express 
     // with an invalid SSL certificate I need to desactivate 
     // the check for this certificate. 
     ServicePointManager.ServerCertificateValidationCallback += 
      (sender, certificate, chain, sslPolicyErrors) => true; 

     using (var client = new HttpClient()) 
     { 
      var buffer = Encoding.ASCII.GetBytes("john:secret"); 
      var authHeader = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(buffer)); 
      client.DefaultRequestHeaders.Authorization = authHeader; 
      var task = client.GetAsync("https://localhost:44300/api/values"); 
      if (task.Result.StatusCode == HttpStatusCode.Unauthorized) 
      { 
       Console.WriteLine("wrong credentials"); 
      } 
      else 
      { 
       task.Result.EnsureSuccessStatusCode(); 
       Console.WriteLine(task.Result.Content.ReadAsAsync<string>().Result); 
      } 
     } 
    } 
} 
+0

धन्यवाद डैरिन, इस ठीक है कि मैं क्या जरूरत है! नियंत्रक विधि में – CodeAbundance

+0

'User.Identity.Name' मेरे लिए खाली है, 'User.Identity.Is प्रमाणीकृत'' false' है। मैं डीबगर में देख सकता हूं कि 'थ्रेड। कंटेंट प्रिंसिपल' संदेश हैंडलर में सही उपयोगकर्ता नाम और भूमिकाओं के साथ प्रिंसिपल पर सेट है। इसके अलावा '[प्राधिकरण (भूमिकाएं = ...)] 'विशेषता का सम्मान किया जाता है: यदि मैं गलत भूमिकाओं वाले उपयोगकर्ता का उपयोग करता हूं तो मुझे अनधिकृत प्रतिक्रिया मिलती है और नियंत्रक विधि तक नहीं पहुंचती है। लेकिन 'User.Identity' में मेरे पास संदेश हैंडलर में सेट मान नहीं है। क्या आपको पता है कि क्या गलत हो सकता है? – Slauma

+0

@ स्लुमा, मैं इसे पुन: उत्पन्न करने में असमर्थ हूं। हो सकता है कि आप समस्या का पुनरुत्पादन कैसे करें (चरण की एक खाली परियोजना से शुरू) चरणबद्ध तरीके से बताते हुए एक नया धागा शुरू कर सकते हैं। –

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