ServiceStack JsonServiceClient(TypeScript):从CORS进行身份验证后,不要转到请求
我按照上面提到的配置了服务:ServiceStack JsonServiceClient(TypeScript):从CORS进行身份验证后,不要转到请求,cors,servicestack,Cors,servicestack,我按照上面提到的配置了服务: Plugins.Add(new CorsFeature( allowCredentials: true, allowedMethods: "GET, POST, PUT, DELETE, OPTIONS", allowedHeaders: "Content-Type, Allow, Authorization, Origin", allowOriginWhitelist: new[] {
Plugins.Add(new CorsFeature(
allowCredentials: true,
allowedMethods: "GET, POST, PUT, DELETE, OPTIONS",
allowedHeaders: "Content-Type, Allow, Authorization, Origin",
allowOriginWhitelist: new[]
{
"http://localhost:4200",
"http://localhost:63342",
"http://localhost:63342",
"http://localhost:3000",
"http://my.site.com"
}));
我有两个函数Login()和GetContacts()
“servicestack客户端”:“0.0.36”
我依次调用这些函数:
1. Login()
2. ContactsGet()
若我在IIS express上本地运行,那个么它可以工作,但当我部署到IIS服务器时,它就不工作了。登录运行正常,但在Internet Explorer和Safari ContactsGet中失败,它返回401状态,但在Chrome中工作
请问我的错误是什么?谢谢
IIS设置
更新
var authFeature = new AuthFeature(
() => new MyUserSession(),
new[] { new MyCredentialsAuthProvider()
});
public class MyCredentialsAuthProvider : CredentialsAuthProvider {
private Userslogic users => Userslogic.Instance;
public override bool TryAuthenticate(IServiceBase authService, string userName, string password) {
if (!users.CheckUserNameAndPassword(userName, password))
return false;
var session = authService.GetSession(false);
session.IsAuthenticated = true;
return true;
}
}
AuthRequet:
ContactsGetRequest:
您的问题是因为客户端没有随请求发送cookie,并且因为您的CORS配置无效而不发送cookie,
AlloworiginHitelist
URL需要与请求发送到的主机名精确匹配,在本例中为http://109.120.152.165
当HTTP客户端中的后续请求不符合上一个请求的
Set Cookie
响应头时,您的CORS配置无效,您需要调查原因。在对该问题的研究中发现,问题出在客户端而不是服务器ServiceStack上,这些限制包括浏览器IE和Safari
请在认证请求之后立即将您的整个
AuthFeature
配置以及认证请求和后续请求的原始HTTP请求/响应头发布到Contacts\u Get
。此外,您应该只使用client.post(requestDto)
发布请求DTO,而不是字符串。您可以使用postToUrl()
发布到URL,但它需要匹配请求DTO的路径,即类似于/contacts
的内容,并且由于它是一个post,因此它应该包含一个针对主体的请求DTO。对于Contacts\u Get
服务,您可能希望使用client.Get(new Contacts\u Get())
。@mythz我更新了问题。你是对的,我不是代码的忠实版本:this.contacts=wait this.client.post(new wbs.contacts_Get());感谢您的反馈!
var authFeature = new AuthFeature(
() => new MyUserSession(),
new[] { new MyCredentialsAuthProvider()
});
public class MyCredentialsAuthProvider : CredentialsAuthProvider {
private Userslogic users => Userslogic.Instance;
public override bool TryAuthenticate(IServiceBase authService, string userName, string password) {
if (!users.CheckUserNameAndPassword(userName, password))
return false;
var session = authService.GetSession(false);
session.IsAuthenticated = true;
return true;
}
}