Принудительный контроль входа в систему .net, чтобы пользователь вышел из системы, если cookie имеет нулевое значение. - PullRequest
1 голос
/ 07 октября 2010

У меня есть веб-приложение с кодовой базой, которое подключено к 2 базам данных.В зависимости от того, какой контроль входа пользователь использует для входа, к коду подключается другая база данных.Я делаю все это с помощью куки.Этот файл cookie находится в общедоступном классе с именем AuthenticatedUser.Класс выглядит следующим образом:

public class AuthenticatedUser : System.Web.UI.Page
{
    public static string ConnectionString
    {
        get
        {
            HttpCookie myCookie = HttpContext.Current.Request.Cookies["connectionString"];
            return GetConnectionStringFromName(myCookie);
        }
        set
        {
            if (HttpContext.Current.Request.Cookies["connectionString"] != null)
            {
                ExpireCookies(HttpContext.Current);
            }
            var allCookies = HttpContext.Current.Request.Cookies.AllKeys;
            HttpCookie cookie = new HttpCookie("connectionString");
            cookie.Value = value;
            cookie.Expires = DateTime.Now.AddYears(100);
            HttpContext.Current.Response.Cookies.Add(cookie);
        }
    }

    private static string GetConnectionStringFromName(HttpCookie myCookie)
{
    try
    {
        string connectionStringName = myCookie.Value;
        return ConfigurationManager.ConnectionStrings[connectionStringName].ConnectionString;
    }
    catch
    {
       FormsAuthentication.SignOut();   
    }
     finally
    {
         HttpContext.Current.Response.Redirect("/default.aspx");
    }
    return "";

}        private static void ExpireCookies(HttpContext current)
    {
        var allCookies = current.Request.Cookies.AllKeys;
        foreach (var cook in allCookies.Select(c => current.Response.Cookies[c]).Where(cook => cook != null))
        {
            cook.Value = "";
            cook.Expires = DateTime.Now.AddDays(-1);
            current.Request.Cookies.Remove(cook.Name);
            cook.Name = "";
        }
    } 
}

Кажется, это работает на моей машине для разработки, но когда я пытался развернуть его, любой пользователь, который использовал опцию «запомнить меня» на сайте, получалошибка нулевой ссылки, поскольку они не использовали элемент управления для входа в систему для получения файла cookie.

Каков наилучший способ обойти это?Я думал, что если пользователь вошел в систему, но класс AuthenticatedUser не смог получить строку подключения для выхода из системы, чтобы заставить его снова использовать элемент управления для входа.Что мне делать?

1 Ответ

1 голос
/ 07 октября 2010

Попробуйте использовать:

try  
{  
      FormsAuthentication.SignOut();  
}  
finally  
{  
      Response.Redirect("~/Home.aspx");  
}

Этот способ предпочтителен, например, если через какое-то время вы примете решение не - cookie-аутентификации, а на основе URL-адреса - FormsAuthentication будет управлять им изящно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...