我在管理员界面中有以下逻辑。我在日志屏幕中也需要类似的逻辑。因此,我计划将此逻辑移至基页。在基页中,如何识别当前页面? (如何区分“管理”屏幕和“日志”屏幕?)。
根据页面,从配置中检索的值不同。
实现这一目标的不同方法有哪些?这些方法的最佳方法是什么?
//Admin Screen
List<string> authorizedRoles = new List<string>((ConfigurationManager.AppSettings["AdminScreenRoles"]).Split(','))
if (!authorizedRoles.Contains(userRole))
{
Response.Redirect("UnauthorizedPage.aspx");
}
//Logs Screen
List<string> authorizedRoles = new List<string>((ConfigurationManager.AppSettings["LogsScreenRoles"]).Split(','))
if (!authorizedRoles.Contains(userRole))
{
Response.Redirect("UnauthorizedPage.aspx");
}
答案 0 :(得分:2)
不要将代码放在识别继承它的类的基础中。添加一个孩子必须覆盖的抽象属性。 在基地:
public abstract string AppSettingsRolesName { get; }
List<string> authorizedRoles = new List<string>((ConfigurationManager.AppSettings[AppSettingsRolesName]).Split(','))
if (!authorizedRoles.Contains(userRole))
{
Response.Redirect("UnauthorizedPage.aspx");
}
在日志中:
public override string AppSettingsRolesName
{
get { return "LogsScreenRoles"; }
}
在管理员中:
public override string AppSettingsRolesName
{
get { return "AdminScreenRoles"; }
}
答案 1 :(得分:0)
最简单的方法是查看表单身份验证,因为它将通过配置文件为您处理所有这些。网上有很多好文章 - 这里有一篇:
http://ondotnet.com/pub/a/dotnet/2003/01/06/formsauthp1.html
但是,如果您正在寻找快速修复方法,最简单的方法是将代码移动到基页中,并使用interface属性使继承的页面指示要使用的角色类型 - 例如类似的东西:
public abstract class BasePage : Page
{
protected abstract string AuthorisedRoles { get; }
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
List<string> authorizedRoles = new List<string>((ConfigurationManager.AppSettings[this.AuthorisedRoles]).Split(','));
if (!authorizedRoles.Contains(userRole))
{
Response.Redirect("UnauthorizedPage.aspx");
}
}
}
public class LogsPage : BasePage
{
protected override string AuthorisedRoles
{
get { return "LogsScreenRoles"; }
}
}
public class AdminPagePage : BasePage
{
protected override string AuthorisedRoles
{
get { return "AdminScreenRoles"; }
}
}
但严重的是,如果您想要正确地进行表单身份验证,请查看表单身份验证 - 它并不像最初看起来那么复杂。