当前位置: 首页 > 编程语言 > C#

使用ServiceStack使用RESTWeb服务时的用户认证分享

时间:2023-04-10 15:35:19 C#

使用ServiceStack使用RESTWeb服务时的用户认证ServiceStack文档中有很多关于如何使用服务端实现用户认证的例子。但是如何在客户端设置用户凭证呢?我使用ServiceStack来使用这样的JSONREST服务:varrestClient=newJsonServiceClient(baseUri);varresponse=restClient.Get("/some/service");如何向请求添加任何形式的身份验证?我想使用的Web服务使用OAuth1.0,但我也有兴趣添加自定义身份验证。在我的代码中,我之前已经执行了一次成功的OAuth令牌交换,所以我已经有了一个有效的访问令牌,现在需要使用此访问令牌及其token_secret对每个REST请求进行token_secret。ServiceStack的AuthTests在使用ServiceStack为客户端提供服务时显示不同的身份验证方法。默认情况下,客户端内置了BasicAuth和DigestAuth,例如:varclient=newJsonServiceClient(baseUri){UserName=UserName,Password=Password,};varrequest=newSecured{Name="test"};varresponse=client.Send(request);在幕后,ServiceStack将尝试正常发送请求,但当请求被服务器拒绝和质疑时,客户端将自动重试相同的请求,但这次使用Basic/DigestAuth标头。要在知道您正在访问安全服务时跳过额外的跃点,您可以告诉客户端始终发送BasicAuth标头:client.AlwaysSendBasicAuthHeader=true;另一种验证方法是显式调用Auth服务(这需要启用CredentialsAuthProvider),例如:varauthResponse=client.Send(newAuth{provider=CredentialsAuthProvider.Name,UserName="user",Password="p@55word",RememberMe=true,//重要的是告诉客户保留永久cookies});varrequest=newSecured{Name="test"};varresponse=client.Send(request);成功调用Auth服务后,客户端将被认证,如果设置了RememberMe,客户端将保留服务器为后续请求添加的会话cookie,这将允许来自该客户端的未来请求被认证。回答我自己,因为我找到了在LocalHttpWebRequestFilter中使用JsonServiceClient的好方法:为了使用OAuth1.0a保护Web服务,每个http请求都必须发送一个特殊的Authorization:标头。在此标头字段中,必须发送一个散列(签名),它使用请求的某些特征作为输入数据,如主机名、请求URL等。现在看来,ServiceStack在LocalHttpWebRequestFilterhttp请求之前调用了LocalHttpWebRequestFilter并公开了底层的HttpWebRequest对象,您可以在其中添加额外的标头并访问请求的必填字段。所以我的解决方案基本上是:varclient=newJsonServiceClient(baseUri);client.LocalHttpWebRequestFilter+=(request)=>{//使用请求和先前获得的访问令牌字符串计算签名authorization_header=CalculateSignature(request,access_token);request.Headers.Add("授权",authorization_header);};varresponse=client.Get("/my/service");请注意,我正在使用Devdefined.OAuth库来完成CalculateSignature()。根据OAuth的要求创建请求令牌、获取用户授权以及将请求令牌交换为访问令牌是在上述服务调用之前在ServiceStack之外完成的。以上就是《C#学习教程:使用ServiceStack使用RESTWeb服务时的用户认证》的全部内容。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: