我已经开发了一套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] 删除。
我来说两句