gpt4 book ai didi

android - 服务堆栈的基本身份验证

转载 作者:太空宇宙 更新时间:2023-11-03 10:48:07 25 4
gpt4 key购买 nike

我在我的 Android 应用程序(使用 Xamerin 编写)中使用 JsonServiceClient。我有一个测试客户端,可以与 servicestack 网站上提供的 HelloWorld 示例一起使用。它无需身份验证即可正常工作并快速返回值。

现在我正尝试将身份验证纳入其中,从非常基本的身份验证开始。我在服务器上有一个自定义的身份验证和 session 类,如下所示:

    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 并删除了对此登录页面的任何引用,但它仍然试图将我发送到那里。

所以我的问题是:我发送凭据的方式是否正确?如果是这样,所提供的代码是否以合理的方式处理它们?

谢谢

最佳答案

您似乎遇到了与此海报相同的问题: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; }
}

我建议阅读整个问题和答案,因为它包含详细的解释。

关于android - 服务堆栈的基本身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18900932/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com