IIS разрешает доступ к определенному контроллеру, но не ко всем веб-сайтам с аутентификацией Windows - PullRequest
0 голосов
/ 10 мая 2018

У меня есть веб-сайт ASP.NET, настроенный для проверки подлинности Windows для определенной доменной группы (MYDOMAIN \ MY_SITE_USERS). Я хочу добавить контроллер с некоторыми действиями, которые можно выполнять из специальной учетной записи Windows, без доступа к остальной части веб-сайта.

Итак:

~   ==> only MYDOMAIN\MY_SITE_USERS
~/DoSomething ==> only MYDOMAIN\MY_SITE_USERS
~/SpecialAction/Do ==> only MYDOMAIN\SPECIAL_ACCOUNT

Я видел другие ответы (используя location в Web.Config), например:

<location path="~/SpecialAction/Do">
    <system.webServer>
        <security>
            <authorization>
                <add accessType="Deny" users="*"/>
                <add accessType="Allow" users="MYDOMAIN\SPECIAL_ACCOUNT"/>
            </authorization>
        </security>
    </system.webServer>
</location>

но моя проблема в том, что с вышеизложенным SPECIAL_ACCOUNT может получить доступ ко всем другим страницам, так как мне нужно добавить к общему:

<authentication mode="Windows" />
<identity impersonate="true"/>
<authorization>
    <allow users="MYDOMAIN\SPECIAL_ACCOUNT" />
    <allow users="MYDOMAIN\MY_SITE_USERS"/>
    <deny users="?" />
    <deny users="*" />
</authorization>

В противном случае MYDOMAIN \ SPECIAL_ACCOUNT вообще не сможет войти в систему.

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Вы пытались использовать какой-либо подход, подобный следующему?

public static class ApplicationRoles
{
    public const string SpecialAccount = @"domain\Special Account";
    public const string MySiteUsers = @"domain\My Site Users";
}

[Authorize(Roles = ApplicationRoles.SpecialAccount)] 
public class SpecialAction()
{
    //stuff
}

[Authorize(Roles = ApplicationRoles.MySiteUsers)] 
public class DoSomething()
{
    //stuff
}

Если вы ищете решение на основе web.config, стоит взглянуть на Динамический контроллер / Авторизация действий в ASP.NET MVC .

Надеюсь, это поможет ...

0 голосов
/ 10 мая 2018

Используйте фильтр действий на контроллерах, которые требуют защиты.

public class FilterAccountsAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
       string username = filterContext.HttpContext.User.Identity.Name;
       //do your logic here for access.

       //if allow no need to do anything

       //else redirect to error page etc?
        filterContext.Result = new RedirectToRouteResult(
                               new RouteValueDictionary
                               {
                                   { "action", "Error" },
                                   { "controller", "Home" },
                                   {"area", ""}
                               });

    }
}

Затем используйте так:

[FilterAccounts]
public class HomeController : Controller
{
}

Вы можете даже расширить вышеприведенное, чтобы принимать аргументы.Если вы можете поместить всю свою логику в один фильтр, то вам нужно только не забыть добавить ее ко всем вашим контроллерам с аргументом, необходимым для его защиты.

[FilterAccounts(FilterEnum.OnlySpecialAccount)]
[FilterAccounts(FilterEnum.OnlySiteUsers)]
...