ServiceStack auth cookie不同的客户端

时间:2013-04-01 08:38:14

标签: servicestack

我鼓励我的公司将ServiceStack用于其中一个软件项目。我一定很喜欢servicestack框架。我遇到了一个我自己无法弄清楚的问题。 在Web应用程序中,我使用ServiceStack c#Jsonclient从登录页面进行身份验证。当我通过身份验证时,c#client会在其中保存ss-id cookie。因此,当我使用相同的c#客户端进行服务调用时,我可以访问我的服务中的会话。 但是有一个自动完成功能,它通过Jquery AJAX调用服务调用客户端(浏览器)未经过身份验证,浏览器也不支持ss-id cookie。 我的问题是当我在代码隐藏时使用c#client进行身份验证时。如何在浏览器上存储会话cookie(是否需要?)所以当我从javascript客户端调用服务时,我也可以在我的服务中访问会话。

感谢您的回复。

2 个答案:

答案 0 :(得分:2)

我的问题是我在代码隐藏时使用c#client进行身份验证。如何在浏览器上存储会话cookie(是否需要?)

因此,您的浏览器需要有一个会话cookie才能让ServiceStack知道它已经成功通过身份验证。浏览器对C#客户端发生的事情一无所知。我不确定您是如何发布您的身份验证数据(用户名/密码/等),但如果是通过浏览器并且您将数据交给C#客户端,则可以执行以下操作。这是MVC,但关键是要将会话cookie从客户端中取出并放入对浏览器的响应中。

    public ActionResult Login()
    {
        var client = new JsonServiceClient("http://localhost");

        var response = client.Post(new Auth() {UserName = "TestUser", Password = "Password"} );

        var ssId = "";
        foreach(Cookie c in client.CookieContainer.GetCookies(new Uri("http://localhost")))
        {
            if (c.Name == "ss-id")
            {
                ssId = c.Value;
            }
        }


        var cookie = new HttpCookie("ss-id", ssId);
        this.ControllerContext.HttpContext.Response.SetCookie(cookie);
        return new EmptyResult();
    }

如果您正在使用MVC this将是一种更好的方法。但是,我不确定您使用C#客户端的原因以及您是如何接收身份验证数据以及您是否有能力进入浏览器的响应。

答案 1 :(得分:0)

在验证浏览器和.NET客户端时,设置“ss-id”和“ss-pid”cookie对我有用。 我的登录控制器的一个重写部分:

[HttpPost]
public ActionResult Logon(Auth auth)
{
    using (var client = new ServiceStack.ServiceClient.Web.JsonServiceClient("://ServicestackUrl/"))
    {
        auth.provider = "credentials";
        auth.RememberMe = true;
        client.UserName = auth.UserName;
        client.Password = auth.Password;
        var authResponse = new AuthResponse();
        try
        {
            authResponse = client.Send(auth);
        }
        catch (WebException ex)
        {
            throw ex;
        }

        foreach (Cookie c in client.CookieContainer.GetCookies(new Uri(client.BaseUri)))
        {
            if (c.Name == "ss-id" || c.Name == "ss-pid")
            {
                Response.SetCookie(new HttpCookie("ss-id", c.Value));
            }
        }

        //Log the user on with forms authentication
        string encryptedTicket = FormsAuthentication.Encrypt(
                new FormsAuthenticationTicket(
                1,
                authResponse.UserName,
                DateTime.Now,
                DateTime.Now.AddMinutes(FormsAuthentication.Timeout.Minutes),
                false,
                ""
            )
        );
        Response.Cookies.Add(
            new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket)
        );
    }

    //Do a redirect or something
    return Redirect(GetRedirectUrl);
}