Членство в ASP.NET - перенаправление пользователей с неоплаченным счетом - PullRequest
0 голосов
/ 30 марта 2012

Я работаю над пользовательской реализацией членства в ASP.NET, которая использует мои собственные таблицы базы данных. Все работает как надо, но мне нужно перенаправить клиентов, которые не оплатили свой счет, на страницу оплаты. Это должно происходить не только при входе в систему, но и для пользователей, которые уже вошли в систему, поэтому, если счет регистрируется как «не оплаченный» во время входа в систему, то пользователь должен быть перенаправлен на страницу оплаты в следующий раз. они загружают страницу.

Можно ли это сделать?

Ответы [ 4 ]

2 голосов
/ 30 марта 2012

Вы можете сделать это на global.asax, используя Application_AuthenticateRequest

protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
       string cTheFile = HttpContext.Current.Request.Path;

       if(!cTheFile.EndsWith("ThePaymentPage.aspx"))
       {           
          if(HttpContext.Current.User != null 
             && HttpContext.Current.User.Identity != null 
              && HttpContext.Current.User.Identity.IsAuthenticated)
          {
              // check here if need to redirect or not.
              if(NeedPayment())
              {
                HttpContext.Current.Responce.Redirect("ThePaymentPage.aspx");
              }
          }
        }
}

Это вызывается на каждой странице, так что, возможно, вы можете добавить еще несколько проверок и сделать это очень быстро. Другие проверки могут быть, если страница заканчивается на .aspx

2 голосов
/ 30 марта 2012

Я сделал нечто подобное, используя HttpModule.То, что вы хотите сделать, это обработать событие PreRequest и, если они аутентифицированы, и, если это так, выполнить проверку неоплаченного счета и перенаправить при необходимости.

например,

protected void OnPreRequestHandlerExecute(object sender, EventArgs e)
{
    if (HttpContext.Current.Request.Path != "/UnPaid.aspx" && HttpContext.Current.User != null)
        {
            if (HttpContext.Current.User.Identity.IsAuthenticated)
            {
                // You don't want to make this check for every resource type
                bool isPage = HttpContext.Current.Request.Path.EndsWith(".aspx") || HttpContext.Current.Request.Path == "/";
                if (isPage)
                {
                    bool isPaid = false; // Make isPaid check here
                    if (!isPaid)
                    {
                        // Optional pass ina return url for after the invoice is paid
                        string returnUrl = HttpUtility.UrlEncode(HttpContext.Current.Request.RawUrl, HttpContext.Current.Request.ContentEncoding);

                        HttpContext.Current.Response.Redirect(string.Concat("/UnPaid.aspx?ReturnUrl=", returnUrl), true);
                    }
                }
            }
        }
    }
2 голосов
/ 30 марта 2012

Я бы не позволил члену организации знать эту информацию. Это должно знать ваше приложение, а не ваша модель безопасности. может быть таким же простым, как добавление / удаление роли, но это тоже не идеально.

0 голосов
/ 30 марта 2012

Как насчет наследования.Вы можете «внедрить» BasePage между классом Page и вашим кодом ASPX за классом.Таким образом, у вас будет доступ к вашим классам бизнес-логики, и затем вы сможете при каждом запросе решать, куда направить пользователя.

Я тоже согласен с тем, что эта логика должна обрабатыватьсябизнес-логика ваших приложений вместо модели безопасности.

Надеюсь, это поможет.

...