6

Şu anda ServiceStack ve onun Authentication and authorization desteğiyle oynuyorum.ServiceNet Web Service Temel Kimlik Doğrulaması ve SetCredentials

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"); 
    } 
} 

hizmet uygulaması ile ünlü Merhaba Dünya biridir:

Use Cases project dan CustomAuthenticationMvc (Web Hizmeti Host uygulamasını değil) Çalışma ve kimlik doğrulama nasıl çalıştığını anlamak için çalışırken, ben bunu [Authenticate] nitelik

[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 
     }; 
    } 
} 

bir Client olarak bir konsol uygulaması kullanarak ... sağ iste DTO yukarıda uygulanan, Bu kodu vardır:

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); 
} 

Buradaki sorun ben restClient.SetCredentials("john", "test"); webservice çağrı restClient.Get<HelloResponse>("/hello/Leniel"); istisna atıyor çünkü beklediğiniz gibi çalıştığını sanmıyorum olmasıdır. Giriş sayfasına yönlendirilmekte olduğumu görüyorum ... Kimlik bilgilerini ayarlamanın web servisini çağırmanın iyi olacağını düşündüm. Burada durum böyle değil.

Neyi yanlış yapıyorum? Kullanıcının kullanıcı adını ve şifresini basit bir iletişim penceresinde yazacağı bir MonoTouch iOS uygulamasından bu web servisini aramayı planlıyorum, ancak bunu yapmadan önce bu basit konsol uygulamasında çalışmak istiyorum.

DÜZENLEME 1

I (bu thread görüldüğü gibi) yetkilendirme isteği göndermek için bu kodu çalıştı:

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

ancak bir istisna atılır:

Tip tanımları 'AuthResponse' serisini bekleyen bir '{' ile başlamalıdır, ile başlayan dizgisi:

0 Varsayılan ASP.NET MVC Login sayfası (aşağıda Kemancı ekran görüntüsü) beni yönlendirme tutar çünkü bir bayan yapılandırılmış hizmeti gibi
<head> 

görünüyor. Ayrıca null'u HtmlRedirect'a geçirerek AuthFeature kaydını değiştirdim.

enter image description here

Bunu görebiliyorum Fiddler'da Auth denetçisi baktığımızda: here açıklandığı gibi

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

DÜZENLEME 2

Fiddler ile oynamak Bir Yetkilendirme isteği başlığını ekleyerek çalıştı:

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

Şimdi neden 401 yetkisiz durumu alıyorum?Sadece test amaçlı bellekte bir kullanıcı kurduğum için işe yaramamalı mıyım?

Örnek üstbilgi uygulamasında istek üstbilgisini nasıl geçebilirim?

Ben konsol uygulamasında yaparsanız:

restClient.AlwaysSendBasicAuthHeader = true; 

ben 401 Yetkisiz yanıt almak ...

DÜZENLEME desunit cevabı ve kod eklemeler yardımıyla 3

, Konsol uygulaması kimlik doğrulamasını aşağıdaki kodla çalışmayı başardım:

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; } 
} 

Şu anki durumu bilmek istiyorum: Bir Konsol Uygulamasında her zaman Temel Kimlik Doğrulama Başlığı'nı göndermeliyim? Bu satırı kaldırırsam, kimlik doğrulaması başarısız olur ve ben HelloResponse.

cevap

4

Sorun, ServiceStack'ın kendisiyle değil, ASP.NET web 401 hata kodunu nasıl işleyeceğiyle ilgilidir. Giriş formuna yönlendirmeyi engelleyen özel IHttpModule ile geçici bir çözüm yapabilirsiniz. Bu sorun hakkında daha fazla bilgi here okunabilir.

oldukça yaygın bir sorun olası çözüm göstermek için we have updatedCustomAuthenticationMvc proje olduğu için.

+0

Oldukça ilginç ... Yeni projeyle GitHub'dan tüm projeyi indirdim ve artık "Basic" ve "Custom" kimlik doğrulaması sadece Index sayfasında "AJAX ile Invoke" düğmesini tıkladığınızda çalışıyorum. İlk tıklamada kullanıcı adı ve parola istenir ve sonraki kullanıcılar doğrudan web servisine gider. Firebug ile hata ayıklama Yetkilendirme üstbilgisini ve çerezleri görebiliyordum. Tüm bu çalışmayı Konsol Uygulaması içinden nasıl yapacağımı bilmiyorum ... Web servisini aramadan önce nasıl kimlik doğrulaması yapabilirim? –

+0

"RestClient.AlwaysSendBasicAuthHeader = true" öğesini ayarlıyorum, '' restClient.SetCredentials ("john", "test") ile kimlik bilgilerini ayarladıktan hemen sonra, sadece çalışır. Niye ya? Bir Konsol Uygulamasında her zaman Temel Yetki Başlığı'nı göndermeliyim? –

+1

Evet, yalnızca SetCredentials'ın kontrol edildiği gibi beklendiği gibi çalışması gerekiyor. Gördüğüm tek sorun, JsonServiceClient'in sizin için X-Requested-With üstbilgisini göndermemesidir, bu nedenle yeniden yönlendirmeyi önlemek için AcceptTypes'ı da kontrol etmeniz gerekir. Bu ek değişiklikler için lütfen [bu taahhüt] bölümüne bakın (https://github.com/ServiceStack/ServiceStack.UseCases/commit/97338a21faa4b92302017354e9e9a970b2a671bc). – desunit