我在Android应用程序中使用JsonServiceClient(使用Xamerin编写)。我有一个测试客户端,它与servicestack网站上给出的HelloWorld示例一起使用。无需身份验证即可正常运行并快速返回值。
现在我正在尝试将身份验证纳入混合,从非常基本的身份验证开始。我在服务器上有一个自定义身份验证和会话类,如下所示:
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。当我尝试使用Linux中的cURL访问它时:
curl -v http://user:1234@172.16.0.15/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并删除了对此登录页面的任何引用,但它仍然试图将我发送到那里。
所以我的问题是:我是否以正确的方式发送凭证?如果是这样,提供的代码是否似乎以合理的方式处理它们?
由于
答案 0 :(得分: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; }
}
我建议阅读整个问题和答案,因为它包含详细的解释。