1
votes

I have a service stack REST-API that I want to access from a client. I have implemented an authorization mechanism using a custom CredentialsAuthProvider.

This is my CustomCredentialsAuthProvider. I have made the example as simple as possible.

public override bool TryAuthenticate(IServiceBase authService, string userName, string password)
{
    if (userName == "admin" && password == "test")
        return true;

    return false;
}

public override IHttpResult OnAuthenticated(IServiceBase authService, IAuthSession session, IAuthTokens tokens, Dictionary<string, string> authInfo)
{
    try
    {
        base.OnAuthenticated(authService, session, tokens, authInfo);

        // Save the browser cookie.
        if (authService.Request is IHttpResponse httpRes)
            httpRes.Cookies.AddPermanentCookie(HttpHeaders.XUserAuthId, session.UserAuthId);

        // Save the user session object (ServiceStack stores it in the in-memory cache).
        authService.SaveSession(session, this.SessionExpiry);

        return new HttpResult(HttpStatusCode.Accepted);
    }
    catch (Exception ex)
    {
        return new HttpResult(HttpStatusCode.ExpectationFailed);
    }
}

Now looking at the ServiceStack documentation here: http://docs.servicestack.net/authentication-and-authorization#authenticating-with-http

It says

To Authenticate with your CustomCredentialsAuthProvider (which inherits from CredentialsAuthProvider) you would POST:

POST localhost:60339/auth/credentials?format=json

{
    "UserName": "admin",
    "Password": "test",
    "RememberMe": true }
}

Sadly I dont know know what function to use in my client to do make such POST-request.

This is my client right now. But this doesnt work of couse.

using (var client = new JsonServiceClient("http://localhost:24131"))
{
    client.AddHeader("Username", "admin");
    client.AddHeader("Password", "test");
    client.Post<HttpWebResponse>("/auth/credentials?format=json");

    response = client.Get(new GetProducts());
}

Can someone give me a simple code example of how to authenticate to my CustomCredentialsAuthProvider form my client?

Thanks

1
Note base.OnAuthenticated() Saves the Session so your custom AuthProvider doesn’t need to as you haven’t modified the session since calling it. - mythz

1 Answers

2
votes

You would normally use the typed Authenticate DTO, e.g:

var client = new JsonServiceClient(baseUrl);
client.Post(new Authenticate {
    provider = “credentials”,
    Username = “admin”,
    Password = “test”,
    RememberMe = true
 });

Note you don’t need to Dispose the JsonServiceClient which is a NO OP.