servicestack,Cors,servicestack" /> servicestack,Cors,servicestack" />

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;
            }
        }