为什么在使用ServiceStack客户端时从ServiceStack服务获得401响应

西蒙·马丁·莱蒙

我已经开发了一套ServiceStack Web服务,这些服务已经运行了好几个月了,主要是从使用ServiceStack客户端库的WPF应用程序开发的。

由于与其他开发人员的服务产生了一些其他问题,因此我决定查看现有WPF应用程序与使用Fiddler的服务之间的请求和响应。

我注意到,在对Web服务方法的每个请求中,ith显示两个请求,第一个返回响应401,第二个返回200。

我们所有的Web服务方法都设置为使用“任何”功能,允许来自客户端的任何动词-即-

[Authenticate]
public object Any(DriverQuery request)
{
    var driver = DriverRepository.GetDriver<DriverEntity>(request.DriverUserId);
    return new DriverResponse { Driver = driver };
}

客户端只使用JsonServiceClient.Send方法-即

var response = client.Send(new DriverQuery { DriverUserId = driverUserId });

我们正在使用基本身份验证。

我担心为什么会发生这种情况,如果这是正常现象还是不正常现象,如果不是,我在做什么错呢?

根据要求提供其他信息

返回401响应的请求:-

POST http://www.*******.uk/Api/jsv/reply/ClientsQuery HTTP/1.1
Accept: application/jsv
LoggedOnUserNameHeader: ******
User-Agent: ServiceStack .NET Client 4.038
Accept-Encoding: gzip,deflate
Content-Type: application/jsv
Host: dev.carbenefitsolutionstest.uk
Content-Length: 2
Expect: 100-continue

{}

401回应

HTTP/1.1 401 Unauthorized
Cache-Control: private
Vary: Accept
Server: Microsoft-IIS/8.5
WWW-Authenticate: basic realm="/auth/basic"
X-Powered-By: ServiceStack/4.038 Win32NT/.NET
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
Access-Control-Allow-Headers: Access-Control-Allow-Origin, Authorization, Content-Type
X-AspNet-Version: 4.0.30319
Set-Cookie: ss-id=5JfAHCT3axaUqDA9eQTA; path=/; HttpOnly
Set-Cookie: ss-pid=yEGg9GfCSbwLZKL4RYsi; expires=Wed, 14-Mar-2035 08:47:48 GMT; path=/; HttpOnly
X-Powered-By: ASP.NET
Date: Sat, 14 Mar 2015 08:47:48 GMT
Content-Length: 0

请求返回200响应:-

POST http://www.*******.uk/Api/jsv/reply/ClientsQuery HTTP/1.1
Accept: application/jsv
LoggedOnUserNameHeader: *******
User-Agent: ServiceStack .NET Client 4.038
Accept-Encoding: gzip,deflate
Content-Type: application/jsv
Host: dev.carbenefitsolutionstest.uk
Cookie: ss-id=5JfAHCT3axaUqDA9eQTA; ss-pid=yEGg9GfCSbwLZKL4RYsi
Authorization: Basic d2Vic2VydmljZTpzdDNybDFuZw==
Content-Length: 2
Expect: 100-continue

{}

200回应

HTTP/1.1 200 OK
Cache-Control: private
Content-Type: application/jsv
Vary: Accept
Server: Microsoft-IIS/8.5
X-Powered-By: ServiceStack/4.038 Win32NT/.NET
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
Access-Control-Allow-Headers: Access-Control-Allow-Origin, Authorization, Content-Type
X-AspNet-Version: 4.0.30319
Set-Cookie: X-UAId=1; expires=Wed, 14-Mar-2035 08:47:48 GMT; path=/; HttpOnly
X-Powered-By: ASP.NET
Date: Sat, 14 Mar 2015 08:47:48 GMT
Content-Length: 78618

我创建了一个从ServiceStack JsvServiceClient派生的基类,该基类处理提供身份验证信息。如下所示。

public abstract class BaseServiceClient : JsvServiceClient
{
    protected BaseServiceClient(string baseUri, TimeSpan serviceTimeout, string currentUserName)
        : base(baseUri)
    {
        Headers.Add(CustomHeaders.LoggedOnUserNameHeader, currentUserName);
        UserName = WebServiceSecurity.GetMasterUsername();
        Password = WebServiceSecurity.GetMasterPassword();
        Timeout = serviceTimeout;
    }
}

服务认证配置代码

Plugins.Add(new AuthFeature(() => new AuthUserSession(), new IAuthProvider[] {new BasicAuthProvider()}));
    var userRepository = new InMemoryAuthRepository();
    container.Register<IUserAuthRepository>(userRepository);

    string hash;
    string salt;

    new SaltedHash().GetHashAndSaltString(WebServiceSecurity.GetMasterPassword(), out hash, out salt);
userRepository.CreateUserAuth(new UserAuth
{
    Id = 1,
    UserName = *UserName*,
    PasswordHash = ******,
    Salt = ******,
    Roles = new List<string> { *Role* },
}, *Password*);

重要的是要注意,我们仅对Web服务方法进行一次调用,并且这两个请求均作为此单个调用的一部分而产生

如果有人可以帮助或确认这是正常行为,将不胜感激。

提前谢谢了

西蒙

神话

第一个请求失败,因为它正在向受保护的服务发送未经身份验证的请求,因此该服务正确地响应了401 UnAuthenticated以指示这一点。错误响应还表明该服务支持带有响应头的HTTP Basic AuthWWW-Authenticate: basic realm="/auth/basic"

发出后续请求时,它包含基本Authorization: Basic d2Vic2VydmljZTpzdDNybDFuZw==身份验证信息,可以在HTTP标头中看到该信息,因为它包含有效的用户名/密码,然后成功。

您可以通过始终随每个请求一起发送基本身份验证信息来跳过初始的未经身份验证的请求和身份验证质询响应。

您可以设置AlwaysSendBasicAuthHeader属性以指示ServiceStack的ServiceClients始终随每个请求发送基本身份验证信息,例如:

client.AlwaysSendBasicAuthHeader = true;

您可以在ServiceClients AuthTests.cs中使用ServiceStack ServiceClients找到其他身份验证示例

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

ServiceStack客户端和歧义路由

来自分类Dev

为什么普通的Web服务客户端使用代理

来自分类Dev

为什么在使用ASP.NET MVC捆绑包时,我的客户端为什么要去服务器检查文件是否被修改?

来自分类Dev

如何使用ServiceStack客户端恢复大文件下载并获得下载进度?

来自分类Dev

如何使用ServiceStack中的证书对客户端进行身份验证?

来自分类Dev

ServiceStack C#客户端发布返回异常

来自分类Dev

ServiceStack Soap 1.2 HTTPS客户端

来自分类Dev

为什么在客户端使用jsp?

来自分类Dev

加密ServiceStack ServerEvents客户端消息传递

来自分类Dev

如何从ServiceStack Swift客户端获取401错误?

来自分类Dev

ServiceStack非正常客户端断开连接

来自分类Dev

ServiceStack JavaScript服务器事件客户端的身份验证

来自分类Dev

ServiceStack Redis客户端:删除所有对象

来自分类Dev

客户端使用vpn或代理时,nodejs服务器不响应

来自分类Dev

为什么在服务器端和客户端同时调用recv和发送功能时使用客户端的文件描述符?

来自分类Dev

为什么在使用ASP.NET MVC捆绑包时,我的客户端为什么要去服务器检查文件是否被修改?

来自分类Dev

为什么服务器在关闭客户端连接时进入无限循环

来自分类Dev

ServiceStack C#客户端发布返回异常

来自分类Dev

在客户端标题或Cookies中使用sessionId时找不到ServiceStack用户会话

来自分类Dev

Java无法获得客户端或服务器响应

来自分类Dev

当使用此“期望”脚本启动时,为什么gdb客户端无法与其gdb服务器通信?

来自分类Dev

servicestack Redis客户端AcquireLock TTL不起作用

来自分类Dev

如何使用servicestack类型的客户端?

来自分类Dev

如何使用Servicestack类型的客户端更新Redis列表中的项目?

来自分类Dev

ServiceStack-如何压缩来自客户端的请求

来自分类Dev

如何从ServiceStack Swift客户端获取401错误?

来自分类Dev

使用Servicestack MsgPack客户端时无法反序列化服务响应

来自分类Dev

Ionic 无法使用 ServiceStack 客户端在 Safari 和 iOS 11 上运行

来自分类Dev

面向不同客户端的 Servicestack 后端

Related 相关文章

  1. 1

    ServiceStack客户端和歧义路由

  2. 2

    为什么普通的Web服务客户端使用代理

  3. 3

    为什么在使用ASP.NET MVC捆绑包时,我的客户端为什么要去服务器检查文件是否被修改?

  4. 4

    如何使用ServiceStack客户端恢复大文件下载并获得下载进度?

  5. 5

    如何使用ServiceStack中的证书对客户端进行身份验证?

  6. 6

    ServiceStack C#客户端发布返回异常

  7. 7

    ServiceStack Soap 1.2 HTTPS客户端

  8. 8

    为什么在客户端使用jsp?

  9. 9

    加密ServiceStack ServerEvents客户端消息传递

  10. 10

    如何从ServiceStack Swift客户端获取401错误?

  11. 11

    ServiceStack非正常客户端断开连接

  12. 12

    ServiceStack JavaScript服务器事件客户端的身份验证

  13. 13

    ServiceStack Redis客户端:删除所有对象

  14. 14

    客户端使用vpn或代理时,nodejs服务器不响应

  15. 15

    为什么在服务器端和客户端同时调用recv和发送功能时使用客户端的文件描述符?

  16. 16

    为什么在使用ASP.NET MVC捆绑包时,我的客户端为什么要去服务器检查文件是否被修改?

  17. 17

    为什么服务器在关闭客户端连接时进入无限循环

  18. 18

    ServiceStack C#客户端发布返回异常

  19. 19

    在客户端标题或Cookies中使用sessionId时找不到ServiceStack用户会话

  20. 20

    Java无法获得客户端或服务器响应

  21. 21

    当使用此“期望”脚本启动时,为什么gdb客户端无法与其gdb服务器通信?

  22. 22

    servicestack Redis客户端AcquireLock TTL不起作用

  23. 23

    如何使用servicestack类型的客户端?

  24. 24

    如何使用Servicestack类型的客户端更新Redis列表中的项目?

  25. 25

    ServiceStack-如何压缩来自客户端的请求

  26. 26

    如何从ServiceStack Swift客户端获取401错误?

  27. 27

    使用Servicestack MsgPack客户端时无法反序列化服务响应

  28. 28

    Ionic 无法使用 ServiceStack 客户端在 Safari 和 iOS 11 上运行

  29. 29

    面向不同客户端的 Servicestack 后端

热门标签

归档