我们使用asp.net 3tire 架构(Farmer System web)创建了一个项目。作为该项目的第二部分,使用Asp.net MVC4(门户网站)开发了另一个网站。这些项目是分开托管的。当用户登录农民系统时,他也可以使用门户。
当用户导航到门户时,我想通过日志记录会话。请任何人告诉我我该怎么做?
我们使用asp.net 3tire 架构(Farmer System web)创建了一个项目。作为该项目的第二部分,使用Asp.net MVC4(门户网站)开发了另一个网站。这些项目是分开托管的。当用户登录农民系统时,他也可以使用门户。
当用户导航到门户时,我想通过日志记录会话。请任何人告诉我我该怎么做?
使用 ServiceStack ISession
ServiceStack 有一个ISession
支持的新接口ICacheClient
,允许您ISession
在 MVC 控制器、ASP.NET 基本页面和 ServiceStack 的 Web 服务之间共享相同的内容,它们共享相同的 Cookie Id,允许您在这些 Web 框架之间自由共享数据。
注意:ISession 是一个干净的实现,它使用 ServiceStack 自己的组件完全绕过现有的 ASP.NET 会话,如ServiceStack 的 MVC PowerPack中所述,并在Sessions wiki 页面中进行了详细说明。
为了轻松使用 ServiceStack 的 Session(缓存和 JSON 序列化器),让您的控制器继承自ServiceStackController(在 MVC 中)或PageBase(在 ASP.NET 中)
ServiceStack 中还添加了新的身份验证/验证功能,您可以在 wiki 上阅读:
使用 ASP.NET 会话
本质上, ServiceStack只是一组在 ASP.NET 或 HttpListener 主机上运行的轻量级IHttpHandler 。如果托管在 IIS/ASP.NET(最常见)中,它就像普通的 ASP.NET 请求一样工作。
ServiceStack 中的任何内容都不会访问或影响底层 ASP.NET 应用程序中配置的缓存和会话提供程序。如果你想启用它,你需要在 ASP.NET 中正常配置它(即在 ServiceStack 之外),请参阅:
http://msdn.microsoft.com/en-us/library/ms178581.aspx
配置完成后,您可以通过单例访问 ServiceStack Web 服务中的 ASP.NET 会话:
HttpContext.Current.Session
或者通过底层 ASP.NET HttpRequest 使用:
var req = (HttpRequest)base.RequestContext.Get<IHttpRequest>().OriginalRequest;
var session = req.RequestContext.HttpContext.Session;
虽然由于默认情况下强制依赖 XML 配置和性能下降,但我更喜欢避免使用 ASP.NET 的 Session,而是选择使用ServiceStack 中包含的更干净的缓存客户端。
基本上,会话的工作方式(包括 ASP.NET)是将包含唯一 id的 cookie添加到唯一标识浏览器会话的响应中。这个id指向服务器上一个匹配的字典/集合,它代表浏览器的会话。
默认情况下,您链接到的IRequiresSession接口不执行任何操作,它只是一种向自定义请求过滤器或基本 Web 服务发出此请求需要进行身份验证的信号(即您应该放置验证/身份验证逻辑的两个地方)在 ServiceStack 中)。
这是一个基本身份验证实现,它查看 Web 服务是否安全,如果是,请确保它们已通过身份验证。
这是另一个身份验证实现,它验证所有标有[Authenticate]属性的服务,以及如何通过在请求 DTO 上添加属性来为您的服务启用身份验证。
上述实现是 ServiceStack 下一版本中包含的多身份验证提供程序模型的一部分。下面的参考示例展示了如何在您的应用程序中注册和配置新的 Auth 模型。
新的 Auth 模型完全是一种选择加入的便利,因为您可以简单地不使用它并使用请求过滤器或在基类中自己实现类似的行为(通过覆盖OnBeforeExecute)。事实上,新的 Auth 服务实际上并没有内置到 ServiceStack 本身中。整个实现存在于可选的ServiceStack.ServiceInterfaces 项目中,并使用自定义请求过滤器实现。
以下是我多年来使用的不同身份验证策略:
使用[Attribute]标记需要身份验证的服务。可能是最惯用的 C# 方式,当会话 ID通过 Cookie 传递时非常理想。
特别是在 Web 上下文之外,有时使用更明确的IRequiresAuthentication接口会更好,因为它提供了对身份验证所需的用户和 SessionId 的强类型访问。
您可以只使用 1-liner 对需要它的每个服务进行身份验证 - 在临时的基础上。当您需要身份验证的服务很少时,这是一种合适的方法。