servicestack,C#,Json,Web Services,Authentication,servicestack" /> servicestack,C#,Json,Web Services,Authentication,servicestack" />

C# 使用带有ServiceStack的REST webservice时的用户身份验证

C# 使用带有ServiceStack的REST webservice时的用户身份验证,c#,json,web-services,authentication,servicestack,C#,Json,Web Services,Authentication,servicestack,这些文档中充满了关于如何使用服务器端实现用户身份验证的示例。但是如何在客户端设置用户凭据呢 我使用ServiceStack使用JSON REST服务,如下所示: var restClient = new JsonServiceClient (baseUri); var response = restClient.Get<MyResponse> ("/some/service"); var restClient=newjsonserviceclient(baseUri); var r

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

我使用ServiceStack使用
JSON REST
服务,如下所示:

var restClient = new JsonServiceClient (baseUri);
var response = restClient.Get<MyResponse> ("/some/service");
var restClient=newjsonserviceclient(baseUri);
var response=restClient.Get(“/some/service”);
如何向请求添加任何形式的身份验证?我想要使用的Web服务使用了OAuth 1.0,但我也对添加自定义身份验证感兴趣

在我的代码中,我以前成功地执行了OAuth令牌交换,因此我已经拥有一个有效的访问令牌,现在需要使用此访问令牌对每个REST请求进行签名,并且它的
token\u secret

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

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

var request = new Secured { Name = "test" };
var response = client.Send<SecureResponse>(request);    
身份验证的另一种方法是显式调用
Auth
服务(这需要启用CredentialAuthProvider),例如:

var authResponse=client.Send(新身份验证){
provider=CredentialAuthProvider.Name,
UserName=“user”,
密码=”p@55word",
RememberMe=true,//重要提示:告诉客户端保留永久cookie
});
var request=newsecured{Name=“test”};
var response=client.Send(请求);

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

回答自己的请求,正如我在
JsonServiceClient
中使用
LocalHttpWebRequestFilter
钩子找到了一个很好的方法:

为了使用OAuth 1.0a保护web服务,每个http请求都必须发送一个特殊的头。在这个头字段中,必须发送一个散列(签名),该散列使用请求的某些特征作为输入数据,如主机名、请求url和url

现在看来,ServiceStack在发出http请求之前调用了
LocalHttpWebRequestFilter
,并公开了底层的
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");
var client=newjsonserviceclient(baseUri);
client.LocalHttpWebRequestFilter+=(请求)=>{
//使用请求和以前获得的
//访问令牌
字符串授权\ U头=计算签名(请求、访问\令牌);
request.Headers.Add(“授权”,授权头);
};
var response=client.Get(“/my/service”);

请注意,我使用库来完成
CalculateSignature()
中所有繁重的工作。根据OAuth的要求,在上述服务调用之前,在ServiceStack之外创建请求令牌、获得用户授权并将请求令牌交换为访问令牌。

Thx,请回答!我正在实现一个遗留服务,因此无法更改身份验证方案。但我找到了一个方法,看看我的答案。我一定不同意你的看法:)OAuth也可以用于Web服务。Tomboy/Ubuntu1将其用于注释同步。第一次设置同步服务器时,它会启动浏览器并完成用户交互/授权。完成后,Tomboy应用程序(使用它自己的http侦听器)被回调并传递一个访问令牌。一旦获得访问令牌,就可以像我的回答中所示,用于将来的所有进一步请求,而无需交互。我正在尝试做类似的事情,让asp.net客户端使用servicestack服务。关于您的实现,有两个问题需要回答。您如何获得访问令牌?通过服务堆栈还是通过其他方式?另外,我在Devdefined.OAuth中没有看到这个CalculateSignature()方法。它被替换了吗?提前感谢您的帮助!
CalculateSignature
只是我放置的一个假人,您必须在那里执行OAuth操作。我使用DevDefined.OAuth来实现这一点。令牌交换只进行一次,而不是每次请求都进行。我使用ServiceStack+DevDefined.OAuth进行交换。整个项目都是开源的,所以你可以看看。令牌交换在此处完成:在每个请求时检查授权的筛选器在此处完成:
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);    
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");