2

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

感谢您的回复。

4

2 回答 2

2

我的问题是当我在代码隐藏上使用 c# 客户端进行身份验证时。如何在浏览器上存储会话 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 ,这将是一个更好的方法。但是,我不确定您使用 C# 客户端的原因以及您如何接收身份验证数据以及您是否能够进入对浏览器的响应。

于 2013-04-01T20:11:52.093 回答
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);
}
于 2013-09-04T09:48:11.633 回答