首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在asp.net MVC4应用程序中重新连接到Servicestack会话

在asp.net MVC4应用程序中重新连接到Servicestack会话
EN

Stack Overflow用户
提问于 2013-10-03 13:43:20
回答 1查看 1.5K关注 0票数 2

我有一个asp.net mvc4 web应用程序,它使用用C#编写并托管在Linux机器w/ Apache / mod_mono上的API中的数据。

客户端应用程序是用C#/asp.net编写的-它运行在不同的web服务器上,也是Linux / Apache / mod_mono。我不确定这些细节在本案中是否重要,但我认为任何背景都可能有所帮助。

引出这个问题的是:AppHostBase实例未设置 --帮助我更好地理解了这一切是如何结合在一起的。

我认为我现在应该问的正确问题是:一旦我在servicestack (在API服务器上)中创建了一个会话,我如何正确地重新连接到它?

按照前面问题中的答案,我在客户机应用程序的auth控制器中使用了这段代码:

代码语言:javascript
运行
复制
        var authService = AppHostBase.Resolve<AuthService>();
        authService.RequestContext = System.Web.HttpContext.Current.ToRequestContext();
        var AuthResponse = authService.Authenticate(new Auth
            {
                provider = "credentials",
                UserName = user.user_id,
                Password = user.password,
                RememberMe = true
            });

这将返回一个ResolutionException:

无法解决ServiceStack.ServiceInterface.Auth.AuthService类型所需的依赖关系。

在让客户端从asp.net应用程序中工作时,我可能缺少一些简单的东西吗?

如果问题太含糊,并乐意提供更多的资料,我很抱歉。

更新:

这是AuthController --请原谅,自从我上一篇文章以来,我一直在尝试一些事情:

代码语言:javascript
运行
复制
{
public partial class AuthController : BaseController
{
    JsonServiceClient client = new ServiceStack.ServiceClient.Web.JsonServiceClient("<TheAPIurl>");

    // GET: /Login/

    public ActionResult login()
    {
        if (Session["IsAuthenticated"] != null)
        {
            ViewData["Result"] = Session["IsAuthenticated"];
        }

        return View();
    }

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult login(UserModel user)
    {
        try
        {
        var authService = AppHostBase.Resolve<AuthService>();
        authService.RequestContext = System.Web.HttpContext.Current.ToRequestContext();
        var AuthResponse = authService.Authenticate(new Auth
            {
                provider = "credentials",
                UserName = user.user_id,
                Password = user.password,
                RememberMe = true
            });

            if (AuthResponse.SessionId != null)
            {
                Session["IsAuthenticated"] = true;
                Session["UserID"] = AuthResponse.UserName;
                Session["jsclient"] = client; 
                FormsAuthentication.SetAuthCookie(user.user_id, true);
                return Redirect("/default");
            }
            else
            {
                Session["IsAuthenticated"] = false;
            }

        }
        catch (Exception ex)
        {
            Session["IsAuthenticated"] = false;
        }

        return View();
    }
    protected override void ExecuteCore()
    {
        throw new NotImplementedException();
    }
}

}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-03 16:36:01

使用本地ServiceStack实例进行身份验证

如果ServiceStack实例驻留在与MVC相同的应用程序域中,则只能从ServiceStack容器中检索自动连接的ServiceStack服务(或其他IOC依赖项),即:

代码语言:javascript
运行
复制
var authService = AppHostBase.Resolve<AuthService>();
authService.RequestContext = System.Web.HttpContext.Current.ToRequestContext();

尽管解决另一个服务的自动连接实现的推荐代码是:

代码语言:javascript
运行
复制
using (var authAservice = AppHostBase.ResolveService<AuthService>()) {
    ...
}

也就是说,服务部门可以利用应当处置的资源。在ServiceStack服务中,您应该使用base.ResolveService<AuthService>()

因此,如果ServiceStack驻留在与MVC相同的AppDomain中,则可以调用服务目录,如下所示:

代码语言:javascript
运行
复制
var authResponse = authService.Authenticate(new Auth {
    provider = "credentials",
    UserName = user.user_id,
    Password = user.password,
    RememberMe = true
});

使用远程ServiceStack实例进行身份验证

否则,如果它是远程的,则需要使用ServiceStack的C#服务客户端之一,例如:

代码语言:javascript
运行
复制
var client = new JsonServiceClient(ServiceStackBaseUrl);
var authResponse = client.Post(new Auth {
    provider = "credentials",
    UserName = user.user_id,
    Password = user.password,
    RememberMe = true
});

将ServiceStack SessionId附加回原始MVC请求

这将通过将ServiceClient客户端附加到ss-pid Cookie来设置一个经过身份验证的会话(更多信息请参见会话文档 )。您可以将此cookie传递给称为MVC的原始浏览器:

代码语言:javascript
运行
复制
var response = HttpContext.Current.Response.ToResponse();
response.Cookies.AddSessionCookie(
    SessionFeature.PermanentSessionId, authResponse.SessionId);

经过身份验证的会话的后续请求

要从MVC内部重新附加经过身份验证的远程ServiceStack会话,您需要将cookie传递回服务客户端,例如:

代码语言:javascript
运行
复制
var cookie = HttpContext.Request.Cookies.Get(SessionFeature.PermanentSessionId);

var client = new JsonServiceClient(ServiceStackBaseUrl);
var cookie = new Cookie(SessionFeature.PermanentSessionId, cookie.Value);
client.CookieContainer.Add(cookie);

您可以在Web.Config中全局设置cookie域:

代码语言:javascript
运行
复制
<httpCookies domain="mydomain.com" />

或在运行时具有:

代码语言:javascript
运行
复制
cookie.Domain = "mydomain.com";

ServiceStack AuthTests.cs集成测试还有一些其他有用的示例,展示了身份验证在ServiceStack中的工作方式。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19160839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档