【问题标题】:Servicestack unauthorized exception after credential authentication is performed执行凭证认证后的 Servicestack 未授权异常
【发布时间】:2014-10-22 16:51:57
【问题描述】:

我正在尝试使 Servicestack Credentials 身份验证正常工作,但是当我尝试使用以[Authenticate] 装饰的受保护服务时,即使身份验证成功,我也会收到未经授权的异常。这里错过了什么?

AppHost 如下所示:

    AuthFeature authFeature = new AuthFeature(() => new AuthUserSession(),
            new IAuthProvider[]{                    
                new BpeCredentialsAuthProvider(), //HTML Form post of UserName/Password credentials                                        
            }) { HtmlRedirect = null };
        authFeature.ServiceRoutes[typeof(AuthService)] = new[] { "/auth" };  
        authFeature.IncludeAssignRoleServices = false;
        Plugins.Add(authFeature);
container.Register<ICacheClient>(new MemoryCacheClient());

我认为我正确地覆盖了TryAuthenticate,并且从 Swagger 中一切正常。问题在于客户端调用 - 在针对 myurl/auth/ 的身份验证成功之后 - 对不同服务的下一次调用失败并出现未经授权的异常。请问有什么想法吗?

经过更多研究:看起来需要将 ss-id/ss-pid cookie 传递给受限资源以进行身份​​验证。我怎样才能做到这一点?

【问题讨论】:

    标签: servicestack-bsd


    【解决方案1】:

    通过 Ajax 进行身份验证时,cookie 会自动发送给后续请求。

    C#/.NET Service Clients 一样,在验证请求时指定RememberMe=true 时,cookie 将保留在已验证服务客户端上,例如:

    var client = new JsonServiceClient(baseUrl);
    
    var authResponse = client.Post(new Authenticate {
        provider = CredentialsAuthProvider.Name,
        UserName = "user",
        Password = "p@55word",
        RememberMe = true,
    });
    

    然后您可以重复使用相同的实例来发出经过身份验证的请求:

    var response = client.Post(new Secure { ... });
    

    您还可以通过分配 CookieContainer 将 cookie 传输到新客户端,例如:

    newClient.CookieContainer = client.CookieContainer;
    

    【讨论】:

    • 感谢您的帮助。
    【解决方案2】:

    我发现不仅需要将 sessionId cookie 传递给后续请求,还需要将整个容器 -ss-id、ss-pid、ss-opt、X-UAId-。我无法从 ICacheClient 访问 cookie 容器,我必须在身份验证完成时手动设置 cookie,并请求该容器的所有 cookie 并将它们添加到新的服务调用中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-14
      • 1970-01-01
      • 2018-12-11
      • 2017-07-15
      • 1970-01-01
      • 2018-07-25
      • 2018-05-29
      • 2010-11-14
      相关资源
      最近更新 更多