Как реализовать безопасность для ASP.NET MVC сайта, чтобы запретить доступ к определенной группе? - PullRequest
1 голос
/ 08 декабря 2010

У меня есть внутренний корпоративный сайт ASP.NET MVC.

Требование (1): Когда кто-либо находится в сети, он может получить доступ к этому сайту, КРОМЕ одной группы AD (Пример: группа AD_Sales).

Требование (2): Также как, например, если человек, у которого есть доступ, передает URL-адрес (например: http://mysite/Home/Index/Product/Letter) сотруднику группы продаж, он все равно НЕ ДОЛЖЕН обращаться к нему и должен отображать пользовательское сообщение о том, что«Вы не авторизованы для просмотра этой страницы».

Если сценарий похож на выдачу доступа к одной группе AD и отказ в доступе для всех остальных, это справедливо. Это можно сделать из IIS.Хотите знать, как это сделать.

Кто-нибудь реализовал безопасность для этого сценария?

Я ценю ваше время и ответы.

Спасибо

Ответы [ 2 ]

3 голосов
/ 08 декабря 2010

Я уверен, что это сработает для вас ...

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 в роли, это означает, что пользователь, имеющий указанную роль, не может получить доступ к странице Letter.

Надеюсь, это поможет.Пожалуйста, проголосуйте, если это помогло вам, и не забудьте пометить его как ответ, если это решит вашу проблему.Спасибо!

0 голосов
/ 08 декабря 2010

Вам необходимо включить проверку подлинности Windows в каталоге вашего приложения. Затем измените ACL соответствующих файлов / каталогов, чтобы запретить доступ к определенной группе. Наконец, сопоставьте ошибку IIS 403 с методом отказа в доступе.

...