IIS允许访问特定的控制器,但不允许使用Windows身份验证访问所有网站

iaqfqrcu  于 2023-02-08  发布在  Windows
关注(0)|答案(2)|浏览(95)

我有一个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根本无法登录。

hjzp0vay

hjzp0vay1#

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

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

az31mfrm

az31mfrm2#

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

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

相关问题