अभी मैं 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
पर पंजीकरण भी बदल दिया।
फ़िडलर में प्रमाणीकरण निरीक्षक मैं यह देख सकते को देखते हुए:
//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.
बहुत रोचक ... मैंने अभी भी नए जोड़े के साथ गिटहब से पूरी परियोजना डाउनलोड की है और अब 'बेसिक' और 'कस्टम' प्रमाणीकरण इंडेक्स पेज में 'AJAX' बटन के साथ आमंत्रित करें' पर क्लिक करते समय बस काम करता है। पहले क्लिक पर यह उपयोगकर्ता नाम और पासवर्ड मांगता है और बाद वाले लोग सीधे वेब सेवा पर जाते हैं। फायरबग के साथ डिबगिंग मैं प्राधिकरण शीर्षलेख और कुकीज़ देख सकता था। मैं सिर्फ यह नहीं जानता कि कंसोल ऐप के भीतर से यह सब काम कैसे करें ... वेब सेवा को कॉल करने से पहले मैं प्रमाणित कैसे कर सकता हूं? –
यदि मैं 'restClient.AlwaysSendBasicAuthHeader = true; '' restClient.SetCredentials ("जॉन", "test") के साथ क्रेडेंशियल्स सेट करने के बाद सही है, तो यह सिर्फ काम करता है। क्यूं कर? एक कंसोल ऐप में मुझे हमेशा मूल ऑथ हेडर भेजना चाहिए? –
हां, बस सेट किए गए सेट क्रेडेंशियल्स को अपेक्षा के अनुसार काम करना चाहिए। एकमात्र समस्या जो मैं देखता हूं वह यह है कि JsonServiceClient आपके लिए एक्स-अनुरोधित-हेडर हेडर नहीं भेजेगा, इसलिए आपको रीडायरेक्ट से बचने के लिए AcceptTypes की भी जांच करनी होगी। इन अतिरिक्त परिवर्तनों के लिए कृपया [यह प्रतिबद्ध] देखें (https://github.com/ServiceStack/ServiceStack.UseCases/commit/97338a21faa4b92302017354e9e9a970b2a671bc)। – desunit