Это может показаться глупым вопросом, но я собираюсь внедрить собственную базу данных безопасности и структуру для нового сайта. Мне было интересно, как лучше справиться с этим.
ПРИМЕЧАНИЕ. Я НЕ использую членство ASP.NET для этого, я использую настраиваемую базу данных и все, что необходимо для управления пользователями.
Там будет несколько уровней безопасности, поэтому я немного в тупике, не делая это слишком сложно. Единственное, о чем я мог подумать, это проверить на КАЖДОЙ СТРАНИЦЕ в Page_Load, если у них есть правильная безопасность:
protected void Page_Load(object sender, EventArgs e)
{
CustomUser user = Session["User"] as CustomUser;
if(user != null && user.CanAccessFeature("TopicModeration"))
{
//initialize page elements
}
else
{
Response.Redirect("Default.aspx?featureDenied=TopicModeration", false);
Context.ApplicationInstance.CompleteRequest();
}
}
Это хорошо работает, но если у меня есть десятки страниц с разными ограничениями, это может немного повториться. У кого-нибудь есть мысли по этому поводу? Должен ли я наследовать от System.Web.Page для каждой функции безопасности и использовать ее на странице?
Благодарю!
Вы можете создать базовый класс и сделать все основные страницы (или страницы) наследуемыми для этого класса.
Вот пример, когда главная страница наследует класс.
Класс для всех основных страниц для наследования.
public class PageBase: System.Web.UI.MasterPage
{
protected override void OnLoad(EventArgs e)
{
//Put your security code here...
base.OnLoad(e);
}
}
Вот главная страница, наследующая класс выше.
public partial class Site1ColMaster : MySite.PageBase
{
protected void Page_Load(object sender, EventArgs e)
{
//Master page
}
}
Могу ли я предложить следующий подход:
Создайте собственный класс контроллера:
public class CustomController : Controller
{
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
CustomUser user = Session["User"] as CustomUser;
if(user != null && user.CanAccessFeature("TopicModeration"))
{
base.OnActionExecuting(filterContext);
}
else
{
filterContext.Result = new RedirectResult("Default.aspx?featureDenied=TopicModeration", false);
Context.ApplicationInstance.CompleteRequest();
}
}
}
Тогда у вас могут быть ваши контроллеры, где вы хотите, чтобы эта проверка наследовалась от этого контроллера.