在JsonServiceClient

时间:2016-10-06 20:01:16

标签: servicestack

我尝试实现自己的自定义CredentialsAuthProvider。服务器似乎可以正常使用以下实现:

public class MyCustomCredentialsAuthProvider : CredentialsAuthProvider
{
    public override bool TryAuthenticate(IServiceBase authService, string userName, string password)
    {
        if (userName == "testuser" && password == "1234")
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    public override IHttpResult OnAuthenticated(IServiceBase authService, IAuthSession session, IAuthTokens tokens,
                                                Dictionary<string, string> authInfo)
    {
        session.FirstName = "Testuser Joe Doe";

        authService.SaveSession(session, SessionExpiry);
        return null;
    }

}

当我在浏览器http://localhost:8088/auth/credentials?UserName=testuser&Password=1234上调用时,我会返回包含会话ID和测试用户Joe Doe的页面。看起来很好。

现在我尝试从我的Windows WPF客户端调用它。我已经创建了一个Login Page和一个LoginViewModel类,因为我实现了MVVM模式。但我不明白,我真正需要在Authenticate类中设置provider属性。

在我的WPF课程中,我有以下内容:

public partial class App : Application
{
    public JsonServiceClient ServiceClient { get; private set; }

    public App()
    {
        this.InitializeComponent();           
    }
    // ....
} 

然后在我的LoginViewModel中我有一个Login()方法,这是一个登录按钮的RelayCommand实现,这样(表单中还包含一个字段,您必须输入应用程序服务器的名称,因为有多个这就是我在处理程序中编写baseUri的原因:

    private void Login()
    {
        var baseUri = $"http://{AppServer}:8088";
        ((App)Application.Current).InitServiceClient(baseUri);
        var client = ((App) Application.Current).ServiceClient;

        //var response = client.Send<AuthResponse>(new Auth { UserName = "Test", Password = "TestPassword" });
        var authResponse = client.Post(new Authenticate
        {
            provider = CredentialsAuthProvider.Name, // <-- WHAT SHOULD THIS BE???
            UserName = "testuser",
            Password = "1234",
            RememberMe = true,
        });
        // .... 
    }
编译器不知道

CredentialsAuthProvider。我需要通过什么以及我需要哪些装配?到目前为止,我有:

  • ServiceStack.Ckient
  • ServiceStack.Interfaces
  • ServiceStack.Text
  • MyService.ServiceModel //包含DTO等的DLL,没有实现

我在这里错过了什么,做错了什么?

1 个答案:

答案 0 :(得分:2)

CredentialsAuthProvider.Name只提供对"credentials"字符串文字的类型访问权限,您可以在其中使用,例如:

var authResponse = client.Post(new Authenticate
{
    provider = "credentials",
    UserName = "testuser",
    Password = "1234",
    RememberMe = true,
});

您可以在身份验证文档中找到Auth provider literals的列表。