IIS 允许访问特定控制器,但不是所有具有 windows 身份验证的网站

IIS allow access to a specific controller but not all website with windows authentication

我有一个 ASP.NET 网站,为特定域组 (MYDOMAIN\MY_SITE_USERS) 设置了 Windows 身份验证。我想添加一个控制器,其中包含一些可以从特殊 Windows 帐户执行的操作,而无需访问网站的其余部分。

所以:

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

我看过其他答案(在 Web.Config 中使用 location)例如:

<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根本无法登录

在需要保护的控制器上使用操作过滤器。

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)]

您是否尝试过使用与以下类似的任何方法?

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 的解决方案,那么值得一看 Dynamic Controller/Action Authorization in ASP.NET MVC

希望这对您有所帮助...