我迷失了这个问题。
我有一个使用Active Directory成员身份的ASP .NET / C#(非MVC)站点,这部分工作正常。我现在需要为站点的页面设置权限,并为用户提供查看页面的适当权限。但是,这是一个很大,但也是,我不能使用角色管理器,因为AD角色设置不正确,我不能使用SQL角色管理,因为高级程序员希望能够限制用户不仅仅是网页,而且如有必要,可以从网页限制用户使用按钮,TxtBox等。
我知道我可以在Masterpage中放置代码来检查每个请求的用户权限。我也知道我将使用SQL表来保存用户(用户名),权限(管理员,查看表单页面等)和userHasPermissions(Joe有Admin,Bob有查看表单等)。
我迷失的地方:
我对如何设置页面权限感到很遗憾。怎么说'联系'页面需要管理员权限,人员目录只需要查看权限吗?我会使用自定义web.sitemap吗?或者它会进入我的数据库?我在网站上有很多页面,那么最好的方法是什么呢?
如果他们没有权限,我如何捕获页面请求以检查所需权限然后取消它(抛出异常)?
如果我错了,请纠正我。但我必须不断从我的母版页查询数据库以检查权限。正确?
对不起所有问题。
感谢任何帮助。感谢。
答案 0 :(得分:0)
老实说,修复AD比写一个解决方法更有意义。如果您决定修复AD角色/安全组,我会在底部留下原始答案。
如果您使用SQL表来存储用户及其角色,则只运行一个查询,根据您想要的角色创建数据集,如果数据集返回行,您知道匹配,您可以从那里执行逻辑(隐藏按钮,重定向到拒绝访问的页面等)。
using (SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
using (SqlDataAdapter da = new SqlDataAdapter("SELECT <USER> FROM <User_Roles> WHERE <USER> = @User AND <ROLE> = @Role", conn))
{
da.SelectCommand.Parameters.Add("@User", SqlDbType.VarChar).Value = HttpContext.Current.User.Identity.Name;
da.SelectCommand.Parameters.Add("@Role", SqlDbType.VarChar).Value = "Admin";
DataSet ds = new DataSet();
da.Fill(ds);
if (ds.Tables[0].Rows.Count > 0)
{
//Make things available
}
else
{
//Make things unavailable or hidden
}
}
推荐答案: 修复您的SG并将其放在每个页面上以定义谁有权限,如果他们没有权限将他们重定向到拒绝访问页面。
if (!(Page.User.IsInRole("Domain\\Security Group")) && !(Page.User.IsInRole("Domain\\SG2"))
&& !(Page.User.IsInRole("Domain\\SG3")) && Page.User.Identity.Name != "Domain\\USER")
{
Server.Transfer("~/AccessDenied.aspx");
}
然后在拒绝访问页面上只需抓取用户名并将消息转发给用户
public void GetUserName()
{
string userName = HttpContext.Current.User.Identity.Name;
Response.Write(userName.ToString());
}
ASP
<section>
Access denied to <% GetUserName(); %>
</section>