我想管理类似于http://fishbowl.pastiche.org/2004/01/19/persistent_login_cookie_best_practice/
的授权Cookie我想在会话开始时检查cookie,如果有用户则对用户进行身份验证,并在每个新会话开始时将其换成新用户。如果不存在,我也想创建一个。
这是为了照顾“记住我”类型的功能 - 类似于SO的工作方式。
为此,我需要能够从global.asax中的Session_Start方法中从容器中提取服务。在调试应用程序时,我逐步执行构造容器的Application_Start方法。一切顺利,并创建了global.asax的Container属性。但是当我进入Session_Start时 - Container为null。
有什么事情我不知道吗?有没有更好的方法来做到这一点?
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
Container = new WindsorContainer().AddFacility<WcfFacility>()
.Install(Configuration.FromXmlFile("Configuration\\Windsor.config"))
.Install(FromAssembly.InDirectory(new AssemblyFilter(HttpRuntime.BinDirectory, "SonaTribe*.dll")));
}
/// <summary>
/// See http://fishbowl.pastiche.org/2004/01/19/persistent_login_cookie_best_practice/
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Session_Start(object sender, EventArgs e)
{
if (Container != null)
{
var accountService = Container.Resolve<IAccountService>();
var logger = Container.Resolve<ILogger>();
var forms = Container.Resolve<IFormsAuthentication>();
// if there is a cookie
if (Context.Request.Cookies["user-id"] != null)
{
try
{
//get the new cookie key from the server
var newUserSessionResponse = accountService.RegisterNewUserSession(new RegisterNewUserSessionRequest
{
SessionId = Context.Request.Cookies["user-id"].Value
});
if (newUserSessionResponse.Success)
{
//do something
}
else
{
logger.Info("Failed attaching the user to the session", newUserSessionResponse.Message);
}
}
catch (Exception exc)
{
logger.Error("Failed attaching the user to the session", exc);
}
}
else
{
//new user:
//do things
}
}
}
由于
瓦特://
答案 0 :(得分:0)
将Container(声明)移动到静态类中并确保它(Container)是静态的。
答案 1 :(得分:0)
实现IContainerAccessor时,将容器存储为全局HttpApplication的静态变量是标准做法。请参阅http://hammett.castleproject.org/?p=233以供参考。
如果不使用静态变量,当ASP.NET运行时处理HttpApplication时,容器将丢失(运行时内部维护一个HttpApplication实例池)。