6

अभी मैं ServiceStack और इसके Authentication and authorization समर्थन के साथ खेल रहा हूं।बेसिक प्रमाणीकरण और सेट क्रेडेंशियल्स के साथ सर्विसस्टैक वेब सेवा

public class AppHost : AppHostBase 
{ 
    public AppHost() : base("Basic Authentication Example", 
                 typeof(AppHost).Assembly) { } 

    public override void Configure(Container container) 
    { 
     // register storage for user sessions 
     container.Register<ICacheClient>(new MemoryCacheClient()); 
     container.Register<ISessionFactory>(c => new SessionFactory(
              c.Resolve<ICacheClient>())); 

     //Register AuthFeature with custom user session and Basic auth provider 
     Plugins.Add(new AuthFeature(
      () => new CustomUserSession(), 
      new AuthProvider[] { new BasicAuthProvider() } 
     )); 

     var userRep = new InMemoryAuthRepository(); 
     container.Register<IUserAuthRepository>(userRep); 

     //Add a user for testing purposes 
     string hash; 
     string salt; 
     new SaltedHash().GetHashAndSaltString("test", out hash, out salt); 
     userRep.CreateUserAuth(new UserAuth 
     { 
      Id = 1, 
      DisplayName = "DisplayName", 
      Email = "[email protected]", 
      UserName = "john", 
      FirstName = "FirstName", 
      LastName = "LastName", 
      PasswordHash = hash, 
      Salt = salt, 
     }, "test"); 
    } 
} 

सेवा कार्यान्वयन के साथ प्रसिद्ध नमस्ते विश्व एक है:

Use Cases project से CustomAuthenticationMvc (वेब ​​सेवा Host एप्लिकेशन) पर कार्य करना और समझने के लिए कैसे काम करता है प्रमाणीकरण की कोशिश करते हुए, मैं इस किया था [Authenticate] विशेषता सही अनुरोध डीटीओ ऊपर लागू ...

[Authenticate] 
[Route("/hello")] 
[Route("/hello/{Name}")] 
public class HelloRequest : IReturn<HelloResponse> 
{ 
    public string Name { get; set; } 
} 

public class HelloResponse 
{ 
    public string Result { get; set; } 
} 

public class HelloService : IService<HelloRequest> 
{ 
    public object Execute(HelloRequest request) 
    { 
     return new HelloResponse 
     { 
      Result = "Hello, " + request.Name 
     }; 
    } 
} 

एक Client के रूप में एक कंसोल अनुप्रयोग का उपयोग करना, मैं इस कोड है:

static void Main(string[] args) 
{ 
    // The host ASP.NET MVC is working OK! When I visit this URL I see the 
    // metadata page. 
    const string BaseUrl = "http://localhost:8088/api"; 

    var restClient = new JsonServiceClient(BaseUrl); 

    restClient.SetCredentials("john", "test"); 

    HelloResponse response = restClient.Get<HelloResponse>("/hello/Leniel"); 

    Console.WriteLine(response.Result); 
} 

समस्या यहाँ मुझे नहीं लगता कि कि restClient.SetCredentials("john", "test"); काम कर रहा है के रूप में मैं वेब सेवा कॉल restClient.Get<HelloResponse>("/hello/Leniel"); एक अपवाद फेंक रहा है, क्योंकि उम्मीद होती है। मैं देखता हूं कि मुझे लॉगिन पेज पर रीडायरेक्ट किया जा रहा है ... मैंने सोचा कि प्रमाण-पत्र स्थापित करना वेब सेवा को कॉल करना ठीक होगा। यह मामला यहां नहीं है।

मैं क्या गलत कर रहा हूं? मैं इस वेब सेवा को मोनो टच आईओएस ऐप से कॉल करने की योजना बना रहा हूं जहां उपयोगकर्ता एक साधारण संवाद विंडो में अपना उपयोगकर्ता नाम और पासवर्ड टाइप करेगा, लेकिन ऐसा करने से पहले मैं इसे इस सरल कंसोल ऐप में काम करना चाहता हूं।

संपादित करें 1

मैं इस कोड की कोशिश की है (जैसा कि इस thread पर देखा) प्रमाणन अनुरोध भेजने के लिए:

var authResponse = restClient.Send<AuthResponse>(new Auth 
{ 
    UserName = "john", 
    Password = "test", 
    RememberMe = true, 
}); 

लेकिन एक अपवाद फेंका जाता है:

प्रकार परिभाषाएँ एक '{' से शुरू होना चाहिए, धारावाहिक प्रकार 'AuthResponse' की अपेक्षा करना, स्ट्रिंग से शुरू हो रहा है:

<head> 

ऐसा लगता है कि मैं एक याद आती है-विन्यस्त सेवा है क्योंकि यह मेरे डिफ़ॉल्ट ASP.NET MVC Login पेज (नीचे फ़िडलर स्क्रीनशॉट देखें) के लिए पुनः निर्देशित रहता है। मैंने AuthFeature पंजीकरण null से HtmlRedirect पर पंजीकरण भी बदल दिया।

enter image description here

फ़िडलर में प्रमाणीकरण निरीक्षक मैं यह देख सकते को देखते हुए:

//Register AuthFeature with custom user session and Basic auth provider 
Plugins.Add(new AuthFeature(
    () => new CustomUserSession(), 
    new AuthProvider[] { new BasicAuthProvider() } 
) { HtmlRedirect = null }); 

संपादित 2

Fiddler के साथ खेलना मैं के रूप में वर्णित here का प्रमाणीकरण अनुरोध हेडर को जोड़े की कोशिश की:

Authorization Header is present: Basic am9objp0ZXN0 
Decoded Username:Password= john:test 

अब, मुझे 401 अनधिकृत स्थिति क्यों मिल रही है?क्या यह सिर्फ यह काम नहीं करना चाहिए कि मैंने उपयोगकर्ता को परीक्षण उद्देश्य के लिए स्मृति में स्थापित किया है?

मैं अपने नमूना कंसोल ऐप में अनुरोध हेडर कैसे पास कर सकता हूं?

मैं सांत्वना अनुप्रयोग में करते हैं:

restClient.AlwaysSendBasicAuthHeader = true; 

मैं 401 अनधिकृत प्रतिसाद मिलता है ...

संपादित 3

desunit के जवाब और कोड जोड़ की मदद से

, मैं निम्नलिखित कोड के साथ काम कर रहे कंसोल ऐप प्रमाणीकरण प्राप्त करने में कामयाब रहा:

class Program 
{ 
    const string BaseUrl = "http://localhost:8088/api"; 

    static void Main(string[] args) 
    { 
     var restClient = new JsonServiceClient(BaseUrl); 

     restClient.SetCredentials("john", "test"); 

     restClient.AlwaysSendBasicAuthHeader = true; 

     HelloResponse response = restClient.Get<HelloResponse>("/hello/Leniel"); 

     Console.WriteLine(response.Result); 
    } 
} 

//Response DTO 
//Follows naming convention 
public class HelloResponse 
{ 
    public string Result { get; set; } 
} 

मैं अब निम्न जानना चाहता हूं: एक कंसोल ऐप में मुझे हमेशा मूल ऑथ हेडर भेजना चाहिए? अगर मैं उस रेखा को हटा देता हूं, तो प्रमाणीकरण बस विफल रहता है और मुझे HelloResponse.

उत्तर

4

समस्या सर्विसस्टैक से संबंधित नहीं है, लेकिन एएसपी.NET वेब 401 त्रुटि कोड को कैसे प्रबंधित करता है। आप इसे कस्टम IHttpModule के साथ काम कर सकते हैं जो लॉगिन फॉर्म पर रीडायरेक्ट दबाता है। उस समस्या के बारे में अधिक जानकारी here पढ़ा जा सकता है।

यह काफी आम समस्या we have updatedCustomAuthenticationMvc परियोजना संभव समाधान प्रदर्शित करने के लिए है के बाद से।

+0

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

+0

यदि मैं 'restClient.AlwaysSendBasicAuthHeader = true; '' restClient.SetCredentials ("जॉन", "test") के साथ क्रेडेंशियल्स सेट करने के बाद सही है, तो यह सिर्फ काम करता है। क्यूं कर? एक कंसोल ऐप में मुझे हमेशा मूल ऑथ हेडर भेजना चाहिए? –

+1

हां, बस सेट किए गए सेट क्रेडेंशियल्स को अपेक्षा के अनुसार काम करना चाहिए। एकमात्र समस्या जो मैं देखता हूं वह यह है कि JsonServiceClient आपके लिए एक्स-अनुरोधित-हेडर हेडर नहीं भेजेगा, इसलिए आपको रीडायरेक्ट से बचने के लिए AcceptTypes की भी जांच करनी होगी। इन अतिरिक्त परिवर्तनों के लिए कृपया [यह प्रतिबद्ध] देखें (https://github.com/ServiceStack/ServiceStack.UseCases/commit/97338a21faa4b92302017354e9e9a970b2a671bc)। – desunit

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