如何实现ASP.NET MVC站点的安全性以拒绝访问特定组?

时间:2010-12-08 02:29:11

标签: asp.net asp.net-mvc asp.net-mvc-2 asp.net-mvc-routing

我有一个内部企业ASP.NET MVC网站。

要求(1):当任何人在网络上时,他们可以访问此站点,除了一个AD组(例如:AD_Sales组)。

要求(2):此外,例如,如果有权访问的人将网址(例如:http://mysite/Home/Index/Product/Letter)传递给销售组人员,他仍然不应该访问需要显示一条自定义消息,说“您无权查看此页面”。

如果场景想要发出对一个AD组的访问权限并拒绝所有其他AD组的访问权限,那么情况就是如此。它可以从IIS完成。我想知道如何做到这一点。

是否有人为此方案实施了安全性?

感谢您的时间和回应。

由于

2 个答案:

答案 0 :(得分:3)

我相信这对你有用......

2个步骤...... 你需要做的第一件事就是你的Global.asax.cs尝试把这个

protected void Application_AcquireRequestState(Object sender, EventArgs e)
    {
        //Context.Handler in this state, we can access Session.
        if (Context.Handler is IRequiresSessionState || Context.Handler is IReadOnlySessionState)
        {
            //Is it a session created in this request?
            if (Session.IsNewSession)
            {
                //Am I already authenticated?
                if (User.Identity.IsAuthenticated)
                {
                    //if already authenticated, check if it is logon, if not, we just logout,
                    //else, we can continue the logon and reset the user identity.
                    string url = Request.Url.ToString();
                    if (url.IndexOf("Account/LogOn") < 0)
                    {
                        FormsAuthentication.SignOut();
                        Response.Redirect(Request.RawUrl);
                    }
                }
            }
            else
            {
                //Am I already authenticated?
                if (User.Identity.IsAuthenticated)
                {
                    try
                    {
                        /// Here we try to get the current role of the user logged in from the session 
                        SessionUser myRole = CurrentUser.GetRole();
                        string[] strRole;
                        switch (myRole)
                        {
                            case Role.ADSales:
                                {
                                    string[] Roles = { "ADSales" };
                                    strRole = Roles;
                                }
                                break;
                            case Role.DeptHead:
                                {
                                    string[] Roles = { "DeptHead" };
                                    strRole = Roles;
                                }
                                break;
                            case Role.ProductionCrew:
                                {
                                    string[] Roles = { "ProductionCrew" };
                                    strRole = Roles;
                                }
                                break;
                            case Role.Admin:
                                {
                                    string[] Roles = { "Admin" };
                                    strRole = Roles;
                                }
                                break;
                            default:
                                throw new AuthenticationException(ErrorEnum.Impossible);
                            //break;
                        }
                        Context.User = new System.Security.Principal.GenericPrincipal(Context.User.Identity, strRole); 

                    }
                    catch (Exception)
                    {
                        string url = Request.Url.ToString();
                        if (url.IndexOf("Account/LogOn") < 0)
                        {
                            FormsAuthentication.SignOut();
                            Response.Redirect(Request.RawUrl);
                        }
                    }


                }
            }
        }
    }

接下来在您的控制器中添加属性

[Authorize(Roles = "ProductionCrew,DeptHead,Admin")]   
public ActionResult Letter()
{
   Return View();
}

请注意,我没有在角色中包含ADSales,这意味着具有所述角色的用户无法访问页面信件。

希望这会有所帮助。如果有帮助,请投票,如果能解决您的问题,请不要忘记将其标记为答案。谢谢!

答案 1 :(得分:0)

您需要在应用程序的目录中启用Windows身份验证。然后更改所涉及的文件/目录的ACL以拒绝访问特定组。最后,将IIS 403错误映射到您的访问被拒绝方法。