Проверка срока действия билета FormAuthentication - PullRequest
1 голос
/ 27 января 2011

У меня есть приложение asp.net, в котором я использую билет FormAuthentication, когда пользователь выполняет вход .... на каждой странице я хочу проверить, не истек ли срок действия билета FormAuthentication.

На самом деле у меня есть два сценария

  1. Я хочу проверить, прошел ли пользователь аутентификацию или пытается получить доступ к странице напрямую без входа (в этом случае я хочу перенаправить на «Default.aspx»

  2. Если пользователь уже подписан и аутентифицирован, но истекло время ожидания (в этом случае я хочу перенаправить на страницу «sexpired.aspx», где пользователь будет уведомлен «Ваш сеанс истек, пожалуйста, войдите снова» с помощью ссылка на "Default.aspx", и он будет перенаправлен обратно на URL-адрес возврата. Пожалуйста, посоветуйте и предложите соответствующие решения.

В настоящее время я делаю это на каждой странице, и я думаю, что когда срок действия cookie истекает, он User.Identity.IsAuthenticated = false также вызывает тайм-аут, когда пользователь пытается загрузить страницу, которую он перенаправляет обратно в «Default.aspx»

Хорошо, вот мой обновленный вопрос с кодом формы входа в систему:

protected void LoginButton_Click(object sender, EventArgs e)
{
   if (AuthenticateUser("SPOINT", txtUsername.Text, txtPassword.Text))
   {
        //Fetch the role
        Database db = DatabaseFactory.CreateDatabase();

        //Create Command object
        DbCommand cmd = db.GetStoredProcCommand("Users");

        db.AddInParameter(cmd, "@userid", System.Data.DbType.String, 20);
        db.SetParameterValue(cmd, "@userid", txtUsername.Text);

        db.AddInParameter(cmd, "@fname", System.Data.DbType.String, 80);
        db.SetParameterValue(cmd, "@fname", null);

        db.AddInParameter(cmd, "@lname", System.Data.DbType.String, 80);
        db.SetParameterValue(cmd, "@lname", null);

        db.AddInParameter(cmd, "@phone", System.Data.DbType.String, 50);
        db.SetParameterValue(cmd, "@phone", null);

        db.AddInParameter(cmd, "@mobile", System.Data.DbType.String, 50);
        db.SetParameterValue(cmd, "@mobile", null);

        db.AddInParameter(cmd, "@email", System.Data.DbType.String, 100);
        db.SetParameterValue(cmd, "@email", null);

        db.AddInParameter(cmd, "@uroleids", System.Data.DbType.String, 50);
        db.SetParameterValue(cmd, "@uroleids", null);

        db.AddInParameter(cmd, "@uroles", System.Data.DbType.String, 500);
        db.SetParameterValue(cmd, "@uroles", null);

        db.AddInParameter(cmd, "@umenu", System.Data.DbType.Int16);
        db.SetParameterValue(cmd, "@umenu", null);

        db.AddInParameter(cmd, "@ustatus", System.Data.DbType.String, 1);
        db.SetParameterValue(cmd, "@ustatus", null);

        db.AddInParameter(cmd, "@reqType", System.Data.DbType.String, 1);
        db.SetParameterValue(cmd, "@reqType", "R");

        db.AddOutParameter(cmd, "@retval", DbType.Int16, 2);

        IDataReader reader = db.ExecuteReader(cmd);

        System.Collections.ArrayList roleList = new System.Collections.ArrayList();
        if (reader.Read())
        {
            roleList.Add(reader[0]);
            string myRoles = (string)roleList[0];
            //Read user name
            string uname = (string)reader[1];
            //Read User menu ID
            int menuID = Convert.ToInt16(reader[2]);

            FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, txtUsername.Text, DateTime.Now,
            DateTime.Now.AddMinutes(30), true, myRoles, FormsAuthentication.FormsCookiePath);

            //Read user full name in session variable which will be shared across the whole application
            Session["uid"] = txtUsername.Text;
            Session["ufullname"] = uname; //myname; //uname;
            Session["branch"] = 1;

            //For security reasons we may hash the cookies
            string hashCookies = FormsAuthentication.Encrypt(ticket);
            HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, hashCookies);

            // add the cookie to user browser
            Response.Cookies.Add(cookie);

            //Constructing Menu according to User Role
            string x = buildmenu(menuID);

            Globals.menuString = null;
            Globals.menuString = x;

            string returnURL = "~/Main.aspx";

            //Close reader object to avoid Connection Pooling troubles
            reader.Close();

            if (Request.QueryString["rUrl"] != null)
                Response.Redirect(Request.QueryString["rUrl"]);
            else
                Response.Redirect(returnURL);
        }
        else
        {
            //Validation Error here...
            lblError.Text = "Incorrect UserID/Password entered...";
            return;
        }
    }
    else
    {
        lblError.Text = "Incorrect UserID/Password entered...";
        return;
   }
}

Вот мой код, где я проверяю билет для проверки подлинности

if (!HttpContext.Current.User.Identity.IsAuthenticated || !HttpContext.Current.User.IsInRole("Maker"))
    Response.Redirect("~/Default.aspx");

Ответы [ 2 ]

0 голосов
/ 27 января 2011

Чтобы настроить открытие страницы по умолчанию, когда пользователь не авторизован, установите loginUrl.

Также не забудьте проверить, что slidingExpiration не установлено на false!

<forms
    name=".ASPXFORMSAUTH"
    loginUrl="Default.aspx"
    defaultUrl="Default.aspx"
    slidingExpiration="true"
    timeout="30" />

MSDN

Чтобы проверить, истекло ли время ожидания, используйте событие Global.asax Application_BeginRequest:

public class Global : HttpApplication
{   
    protected virtual void Application_BeginRequest(object sender, EventArgs e)
    {
        if (!his.User.Identity.IsAuthenticated)
            this.Response.Redirect("Timeout.aspx");
    }    
}
0 голосов
/ 27 января 2011

Без вашего логина / кода авторизации сложно определить, как у вас настроены вещи.

Первое, что вы, вероятно, должны сделать, это установить тайм-аут сеанса / cookie на время окончания сеанса + 1 минута (например, 21 минута)

Затем вы можете написать HttpModule, чтобы проверить время ожидания и перенаправить

public class ExpireModule : IHttpModule {

    public virtual void Init(HttpApplication app) {
        app.PostAuthenticateRequest += new EventHandler(app_PostAuthenticateRequest);
    }

    private void app_PostAuthenticateRequest(object sender, EventArgs e) {
        //check ticket
        //if old, kill login, redirect to session timeout page
    }
}

Или сделать то же самое на общей базовой странице (если она есть)

Сделав тайм-аут сеанса 21 минутой, вы можете использовать весь стандартный код авторизации

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