我试图让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 / success的身份验证之后 - 下一次调用其他服务会因未经授权的异常而失败。有什么好主意吗?
经过更多研究:看起来需要将ss-id / ss-pid cookie传递给受限资源进行身份验证。我怎样才能做到这一点?
答案 0 :(得分:0)
通过Ajax进行身份验证时,Cookie会自动发送给后续请求。
与C#/.NET Service Clients同样,在对请求进行身份验证时指定RememberMe=true
时,Cookie将保留在Authenticated Service Client上,例如:
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
例如
newClient.CookieContainer = client.CookieContainer;
答案 1 :(得分:0)
我发现不仅需要将sessionId cookie传递给后续请求,还要传递整个容器-ss-id,ss-pid,ss-opt,X-UAId-。我无法从ICacheClient访问cookie容器,我必须在身份验证到位时手动设置cookie并请求该容器的所有cookie并将它们添加到新的服务调用中。