Con MVC 2, ¿cómo evito que la sesión de una aplicación no cierre al usuario en una segunda aplicación?

StackOverflow https://stackoverflow.com/questions/9301645

Pregunta

En VS2010 tengo dos aplicaciones web basadas en MVC 2 dentro de la misma solución que también comparten un proyecto de configuración común. Una aplicación es una utilidad de configuración para configurar usuarios y variables en la aplicación opuesta. Tras la instalación, los dos directorios IIS se ven así en el navegador del usuario: App1: http: // localhost/app1/auth/loginAPP2: http: // localhost/app1/app2/auth/inicio de sesión

El problema que tengo es cuando el usuario tiene ambas aplicaciones abiertas al mismo tiempo, y se cierran de una de ellas también están registradas de la aplicación opuesta. Este es un problema menor, pero he tenido la tarea de corregirlo.

Por lo que puedo decir, las dos aplicaciones deben compartir el mismo objeto de sesión, porque el método de comando de sesión de cierre de sesión en cada controlador invoca session.abandon ().

Solo dos controladores tienen la capacidad de cerrar sesión en un usuario; Aquí está el constructor de esos controladores:

App1: espacio de nombres App1.Controllers

/// <summary>
/// Functionality related to Assets
/// </summary>
public class AssetsController : Controller
{
private IConfig _config = null;
private IProfileRepository _profiles = null;
private IInspectionRepository _inspections = null;
private ICustomLabelsFactory _labels = null;
private IValidateRepository _validator = null;

/// <summary>
/// Create an instance of the AssetsController which uses the db.
/// </summary>
public AssetsController() : this(Config.Current, new ProfileRepository(Config.Current), new InspectionRepository(), new CustomLabelFactory(), new ValidateRepository()) { }

/// <summary>
/// Create an instance of the AssetsController with the given
/// IInspectionRepository implementation.
/// </summary>
/// <param name="inspections">IInspectionRepository implementation.</param>
public AssetsController(IConfig config, IProfileRepository profiles, IInspectionRepository inspections, ICustomLabelsFactory labels, IValidateRepository validator)
    : base()
{
    ViewData["_Module"] = "Assets";

    _config = config;

    _profiles = profiles;
    _profiles.ModelState = ModelState;

    _inspections = inspections;
    _inspections.ModelState = ModelState;

    _labels = labels;
    _labels.ModelState = ModelState;

    _validator = validator;
    _validator.CustomLabels = _labels.Assets;
    _validator.ModelState = ModelState;
}

APP2: espacio de nombres APP1.App2.Controllers

/// <summary>
/// Handles login/logout functionality
/// </summary>
public class AuthController : Controller
{
private ILoginService _login;
private IUtilityRepository _utility;

/// <summary>
/// Creates the Auth controller using the default User Repository which
/// uses the database.
/// </summary>
public AuthController() : this(new LoginService(), new UtilityRepository()) { }

/// <summary>
/// Creates the Auth controller with the given User Repository.
/// </summary>
/// <param name="userRepository">IUserRepository implementation.</param>
public AuthController(ILoginService loginService, IUtilityRepository utility)
    : base()
{
    ViewData["_Module"] = "Login";

    _login = loginService;
    _login.ModelState = ModelState;

    _utility = utility;
    _utility.ModelState = ModelState;
}

Podría estar ladrando el árbol equivocado en dónde comenzar a mirar el código, pero espero que alguien pueda ver algo obvio aquí que no puedo. O tal vez alguien pueda decirme cómo hacer esto de manera diferente para que no haya un objeto de sesión compartido involucrado. He estado trabajando en esto de vez en cuando durante la mejor parte de esta semana, por lo que cualquier ayuda ofrecida será muy apreciada.

¿Fue útil?

Solución

Puede configurar cada aplicación para usar una base de datos de sesión diferente en su web.config

Editar: algo como

<sessionState mode="SQLServer" sqlConnectionString="Data Source=.\SQLEXPRESS;User Id=test;Password=test;Application Name=AppName"  />
    <machineKey
validationKey="SOMEKEY"
validation="SHA1" decryption="AES"
/>

Donde SomeKey es diferente para cada aplicación

Otros consejos

Una configuración simple, perezosa y de IIS, evita la solución es abrir cada una en un navegador diferente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top