servicestack,Session,Authentication,servicestack" /> servicestack,Session,Authentication,servicestack" />

Session ServiceStack:在自托管应用程序中访问HttpRequest

Session ServiceStack:在自托管应用程序中访问HttpRequest,session,authentication,servicestack,Session,Authentication,servicestack,我目前有一个IIS托管的应用程序,我想切换到使用自托管方法 但是我在访问会话时遇到困难,因此无法检索当前用户的用户名 这是我在IIS下托管时使用的代码,它工作得非常好: /// <summary> /// A basic wrapper for the service stack session, to allow access to it lower down in the DAL layer without tying us to servicestack. /// </s

我目前有一个IIS托管的应用程序,我想切换到使用自托管方法

但是我在访问会话时遇到困难,因此无法检索当前用户的用户名

这是我在IIS下托管时使用的代码,它工作得非常好:

/// <summary>
/// A basic wrapper for the service stack session, to allow access to it lower down in the DAL layer without tying us to servicestack.
/// </summary>
public class ServiceStackAuthTokenService : IAuthTokenService
{
    /// <summary>
    /// GetCurrentAuthToken.
    /// </summary>
    /// <returns>A string representing the users auth name.</returns>
    public string GetCurrentAuthToken()
    {
        // Grab the current request.
        var req = HttpContext.Current.Request.ToRequest();
        var res = HttpContext.Current.Response.ToResponse();

        // Fetch the authentication service.
        var authService = EndpointHost.AppHost.TryResolve<AuthService>();
        authService.RequestContext = new HttpRequestContext(req, res, null);

        // Grab the session.
        var session = authService.GetSession(false);

        // Return the username.
        return session.UserName;
    }

    public string UserPropertyName
    {
        get { return "UserName"; }
    }
}
//
///服务堆栈会话的基本包装器,允许在DAL层的较低层访问它,而无需将我们绑定到servicestack。
/// 
公共类ServiceStackAuthTokenService:IAuthTokenService
{
/// 
///GetCurrentAuthToken。
/// 
///表示用户身份验证名称的字符串。
公共字符串GetCurrentAuthToken()
{
//获取当前请求。
var req=HttpContext.Current.Request.ToRequest();
var res=HttpContext.Current.Response.ToResponse();
//获取身份验证服务。
var authService=EndpointHost.AppHost.TryResolve

建议使用:

container.Register>(c=>AuthService.CurrentSessionFactory)

这只是返回一个新的IAuthSession

那篇文章中的用户所做的正是我想要实现的

在最后一篇博文中,Mythz说:

需要明确的是,为了形成引用用户会话的会话密钥,您需要ss id或ss pid cookie(由ss opts确定)。 您可以从IHttpRequest对象或ASP.NET的HttpContext.Current.Request singleton中获取Cookie,因此无论您注入什么IAuthUserSession工厂,都需要获取可以提供Cookie的内容,即IRequestContext、IHttpRequest、iSeries等


但是我仍然看不到访问IHttpRequest的方法。

对于ServiceStack 3,您可以通过
HostContext.Instance.Items
字典共享请求数据。对于ServiceStack 4,您应该使用
HostContext.RequestContext.Items
字典

例如,在应用程序主机配置中添加请求筛选器以保存值:

// Put the session into the hostcontext.
RequestFilters.Add((req, res, requestDto) =>
{
  HostContext.Instance.Items.Add("Session", req.GetSession());
});
然后在您的身份验证令牌类中将其拉出:

public string GetCurrentAuthToken()
{
  var session = HostContext.Instance.Items["Session"] as AuthUserSession;

   if (session != null)
   {
     return session.UserName;
   }

   throw new Exception("No attached session found.");
}

GetCurrentAuthToken()在应用程序中何时/何处被调用?如果它在服务中,则可以将IHttpRequest和IHTTPreSpose传递到类似GetCurrentAuthToken(base.Request,base.Response)的方法中.Hi Paaschpa,它发生在与服务层没有直接关系的DAL层中。我可以将上下文传递到DAL中,但这会违反设计并使每个层保持独立。进一步研究后,我可以看到IHttpRequest和IHttpResponse正在通过iRequestRequestContext int注入服务服务基类中的eFace。我基本上希望能够访问相同的内容,以便能够访问存储客户端会话的缓存。使用reflector查看服务类,我可以看到if(this.userSession==null){this.userSession=this.TryResolve();if(this.userSession==null){this.userSession=this.Cache.SessionAs(this.Request,this.Response);}}}返回(TUserSession)((对象)this.userSession);这段代码似乎表明,会话可以通过缓存访问。HostContext.Instance真的是每个请求吗?据我所知,它似乎是。在每个请求中,它似乎都是空的,并且没有保留以前调用的任何信息。在servictstack源中(AppHostBase.cs)中有这一点,这对我来说意味着每次请求时它都是空的。public virtual void OnEndRequest(){foreach(HostContext.Instance.Items.Values中的var item){Release(item);}HostContext.Instance.EndRequest();}但就像所有事情一样,也许可以尝试一下,看看是否对您有效。那么您如何将事情保存回会话中?老实说,我不确定。我希望Mythz能够参与进来,并为我们提供一些额外的信息。我已经有一段时间没有做这方面的工作了,因为我一直很忙,但如果我遇到问题并回答,我将提供进一步的信息重申。我知道这是一个古老的帖子,但人们似乎对它投了反对票。这对我来说意味着他们知道更好的方式,或者这是不正确的。如果是这样的话,我想听听正确的方式是什么,或者为什么投反对票。
public string GetCurrentAuthToken()
{
  var session = HostContext.Instance.Items["Session"] as AuthUserSession;

   if (session != null)
   {
     return session.UserName;
   }

   throw new Exception("No attached session found.");
}