Отображать код HTML в зависимости от того, в какую группу входит пользователь - PullRequest
0 голосов
/ 19 февраля 2020

Я хотел бы выборочно отображать блок текста на странице в зависимости от того, в какой AD-группе находится пользователь. Страница представляет собой простой список ссылок банкомата, контроллер не требуется. У меня есть код ниже, который отлично работает при локальной разработке (я вошел в AD) - как только я публикую sh приложение на сервере IIS, я получаю ошибку 404 - я смог найти точную строку что вызывает ошибку -> в ActiveDirectory.IsInGroup () строка group.Translate является виновником.

Я проверил Просмотр событий на сервере IIS (и в журнале для IIS), но вообще ничего не регистрируется?

Это индекс. html:

@page
@using System.Security.Principal
@{
    ViewData["Title"] = "Landing Page";
}

@{    
   var principal = new WindowsPrincipal(WindowsIdentity.GetCurrent());
   bool itUser = ActiveDirectory.IsInGroup(principal, "IT Department");
}

<h4>Header</h4>

@if (itUser || adminUser)
    {
       <div class="card mb-4 shadow-sm">
          <div class="card-header">
             <h4 class="my-0 font-weight-normal">IT</h4>
          </div>
          <div class="card-body">
             <a target="_blank" href="http://www.test.com/Configuration/Index" class="btn btn-secondary my-2">Application Config</a><br />
          </div>
       </div>
    }

вот код C#:

public static class ActiveDirectory

       public static bool IsInGroup(ClaimsPrincipal checkUser, string checkGroupName)
    {
        var identity = (WindowsIdentity)checkUser.Identity;
        if (identity?.Groups == null) return false;

        foreach (var group in identity.Groups)
        {
            var groupName = group.Translate(typeof(NTAccount)).ToString(); // this gives me a 404 error
            if (groupName.ToLower().Contains(checkGroupName.ToLower())) return true;
        }

        return false;
    }
}

1 Ответ

1 голос
/ 19 февраля 2020

Неиспользование контроллера является плохой практикой (и это отрицает цель использования MVC Framework (Model View Controller)), особенно в связи с установлением проверок на возможность проверки и проверки подлинности / авторизации.

Наилучшей практикой будет чтобы ваш ActionResult по умолчанию (установленный в вашем файле RouteConfig) на вашем контроллере вызывал функцию, которую вы определили, чтобы получить список групп, в которые входит ваш конечный пользователь

Пример:

Передайте следующее в каждом контроллере ActionResult:

// what will be needed:    
using System.DirectoryServices;
using System.DirectoryServices.ActiveDirectory;



var userSignOn = System.Web.HttpContext.Current.Request.LogonUserIdentity.Name;

List<string> activedirectoryGroupList = new List<string>();

activedirectoryGroupList = GetGroupsFromSignOn(userSignOn);

Вызываемая функция:

internal static List<string> GetGroupsFromSignOn(string signOn)
{
    string searchText = "(&(objectCategory=person)(objectClass=user)(sAMAccountName={0}))";
    searchText = searchText.Replace("{0}", signOn);

    Domain domain = Domain.GetCurrentDomain();
    DirectoryEntry userEntry = domain.GetDirectoryEntry();

    DirectorySearcher searcher = new DirectorySearcher(userEntry, searchText);
    SearchResult result = searcher.FindOne();

    DirectoryEntry currentUserEntry = result.GetDirectoryEntry();

    List<string> activedirectoryGroupList = new List<string>();

    if (currentUserEntry != null)
    {           
        int propertyCount = currentUserEntry.Properties["memberOf"].Count;

        string activedirectoryGroup;

        for (int i = 0; i < propertyCount; i++)
        {
            activedirectoryGroup = Convert.ToString(currentUserEntry.Properties["memberOf"][i]);

            int startIndex = activedirectoryGroup.IndexOf('=');
            startIndex += 1;

            int endIndex = activedirectoryGroup.IndexOf(',');

            int stringLength = endIndex - startIndex;

            activedirectoryGroup = activedirectoryGroup.Substring(startIndex, stringLength);

            activedirectoryGroupList.Add(activedirectoryGroup);
        }

        return activedirectoryGroupList;
    }
    else
    {
        return null;
    }
}

Оттуда у вас будет список AD Группы, в которые будет входить ваш пользователь, и вы можете либо сопоставить эти группы с именами вашей авторизованной группы, которые вы можете установить либо в файле веб-конфигурации, либо в базе данных SQL, к которой вы можете обратиться.

Что касается определения того, что будет отображаться, вам, вероятно, следует настроить главное представление с частичными представлениями, отображаемыми на этом страница в зависимости от статуса авторизации вашего пользователя для этой информации.

Редактировать:

Полезная тема о проблемах аутентификации с asp. net MVC

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...