2013-09-19 3 views
4

Я использую JsonServiceClient в своем приложении для Android (написано с Xamerin). У меня есть тестовый клиент, который работает с примером HelloWorld, указанным на веб-сайте servicestack. Он отлично работает без аутентификации и быстро возвращает значения.Базовая аутентификация с использованием стека службы

Теперь я пытаюсь привести аутентификацию в микс, начиная с очень простой аутентификации. У меня есть пользовательская авторизация и класс сеанса на сервере, который выглядит следующим образом:

public class userSession : AuthUserSession 
    { 
     public string clientCode { get; set; } 
    } 

    public class userAuth : CredentialsAuthProvider 
    { 
     public override bool TryAuthenticate(IServiceBase authService, string userName, string password) 
     { 
      if (userName == "user" || password == "1234") { 
       var session = (userSession)authService.GetSession(false); 
       session.clientCode = "peruse"; 
       return true ; 
      } else { 
       return false; 
      } 
     } 
    } 

и сконфигурирован с:

 // auth feature and session feature 
     Plugins.Add(new AuthFeature(
      () => new userSession(), 
      new[] { new userAuth() } 
     ) { HtmlRedirect = null }); 

На стороне клиента, я зову новую JsonServerClient с:

JsonServiceClient client = new ServiceStack.ServiceClient.Web.JsonServiceClient("http://172.16.0.15/"); 

И событие для кнопки на Android интерфейс:

  try 
      { 
       client.SetCredentials("user", "1234"); 
       HelloResponse response = client.Get<HelloResponse>("/hello/" + toSum.Text); 
       txtResult.Text = response.Result ; 
      } 
      catch (Exception ex) 
      { 
       txtResult.Text = ex.Message; 
      } 

Я продолжаю получать обратно 404 с сервера. При попытке доступа к нему с Curl от Linux:

curl -v http://user:[email protected]/hello/5 

возвращает:

* Trying 172.16.0.15... connected 
* Server auth using Basic with user 'user' 
> GET /hello/5 HTTP/1.1 
> Authorization: Basic dXNlcjoxMjM0 

(Другой многословным материал ... потом ...)

HTTP/1.1 302 Found 

Наряду с тем, что выглядит как ссылка на страницу входа в систему:

<html><head><title>Object moved</title></head><body> 
<h2>Object moved to <a href="/login.aspx?ReturnUrl=%2fhello%2f5">here</a></h2> 
</body><html> 

Я зашел в Web.config и удалил любую ссылку на эту страницу входа, но все же он пытается отправить меня туда.

Так что мой вопрос: правильно ли я отправляю учетные данные? Если да, то предоставленный код, похоже, обрабатывает их разумным образом?

Благодаря

ответ

1

Похоже, вы с той же проблемой, как этот плакат: ServiceStack Web Service with Basic Authentication and SetCredentials Ему удалось получить аутентификации работает со следующим кодом:

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

Я рекомендую прочитать весь вопрос и ответ, так как он содержит подробные объяснения.

Смежные вопросы