9

ServiceStack文档充满了关于如何使用服务器端实现用户身份验证的示例。但是如何在客户端设置用户凭据?

我使用 ServiceStack 来使用这样的JSON REST服务:

var restClient = new JsonServiceClient (baseUri);
var response = restClient.Get<MyResponse> ("/some/service");

如何向请求添加任何形式的身份验证?我想使用的网络服务使用OAuth 1.0,但我也有兴趣添加自定义身份验证。

在我的代码中,我之前已成功执行 OAuth 令牌交换,因此我已经拥有一个有效的访问令牌,现在需要使用此访问令牌及其token_secret.

4

2 回答 2

8

ServiceStack 的AuthTests显示了使用 ServiceStack 服务客户端时的不同身份验证方式。默认情况下,BasicAuth 和 DigestAuth 内置在客户端中,例如:

var client = new JsonServiceClient(baseUri) {
    UserName = UserName,
    Password = Password,
};

var request = new Secured { Name = "test" };
var response = client.Send<SecureResponse>(request);    

在幕后,ServiceStack 将尝试正常发送请求,但当请求被服务器拒绝和质询时,客户端将自动重试相同的请求,但这次使用 Basic/Digest Auth 标头。

当您知道您正在访问安全服务时,要跳过额外的跃点,您可以告诉客户端始终发送 BasicAuth 标头:

client.AlwaysSendBasicAuthHeader = true;

验证的另一种方法是显式调用Auth服务(这需要启用 CredentialsAuthProvider),例如:

var authResponse = client.Send<AuthResponse>(new Auth {
    provider = CredentialsAuthProvider.Name,
    UserName = "user",
    Password = "p@55word",
    RememberMe = true,  //important tell client to retain permanent cookies
});

var request = new Secured { Name = "test" };
var response = client.Send<SecureResponse>(request);    

成功调用Auth服务后,客户端已通过身份验证,如果设置了RememberMe,客户端将保留服务器在后续请求中添加的会话 Cookie,这使得来自该客户端的未来请求能够通过身份验证。

于 2012-12-09T18:12:26.743 回答
7

回答我自己,因为我找到了一种使用LocalHttpWebRequestFilter钩子的好方法JsonServiceClient

为了使用 OAuth 1.0a 保护 Web 服务,每个 http 请求都必须发送一个特殊的Authorization:标头。在此标头字段中,必须发送使用请求的某些特征作为输入数据的哈希(签名),例如主机名、请求 url

现在看来LocalHttpWebRequestFilter,ServiceStack 在发出 http 请求之前就调用了它,并公开了底层HttpWebRequest对象,人们可以在其中添加额外的标头并访问请求的所需字段。

所以我的解决方案现在基本上是:

var client = new JsonServiceClient (baseUri);

client.LocalHttpWebRequestFilter += (request) => {
    // compute signature using request and a previously obtained
    //  access token 
    string authorization_header = CalculateSignature (request, access_token);
  
    request.Headers.Add ("Authorization", authorization_header);
};
var response = client.Get<MySecuredResponse> ("/my/service");

请注意,我使用Devdefined.OAuth库在CalculateSignature(). 在上述服务调用之前,OAuth 要求的请求令牌的创建、获取用户授权以及将请求令牌交换为访问令牌是在 ServiceStack 之外完成的。

于 2012-12-09T19:47:02.153 回答