【问题标题】:IIS allow access to a specific controller but not all website with windows authenticationIIS 允许访问特定控制器,但不是所有具有 Windows 身份验证的网站
【发布时间】:2018-10-20 14:20:43
【问题描述】:

我有一个为特定域组 (MYDOMAIN\MY_SITE_USERS) 设置了 Windows 身份验证的 ASP.NET 网站。我想添加一个控制器,其中包含一些可以从特殊 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 根本无法登录。

【问题讨论】:

  • 能否给相关的windows用户添加一个特殊的角色或组?
  • @ste-fu 是的,如果有帮助我可以
  • @ste-fu 我认为这是一个理解场景的问题。如果改为“您是否尝试过使用角色/组”,那么答案是肯定的,我尝试过,没有任何变化
  • 抱歉耽搁了我才看到通知。我在想您可以将角色/组添加到“MySiteUsers”而不是“SpecialAccount”,然后您可以将适当的“Authorize”属性添加到您的其他控制器

标签: asp.net-mvc iis web-config windows-authentication


【解决方案1】:

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

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

【讨论】:

  • 感谢您的帮助。这意味着我需要在每个控制器上使用该属性,不切实际......我希望 Web.config 中可以有一个解决方案,所以我们不需要在代码中硬编码组/身份(这意味着如果你想要改变你需要一个新的构建)。如果我找不到解决方案,这将是我最好的选择!
  • 如果您想变得更时髦,您可以全局添加过滤器并使用ActionExecutingContext 来确定您在应用程序中的位置。显然不鼓励这种方法,因为它是保护路由和控制器之间的区别。
  • 没有开箱即用的解决方案感觉很奇怪。它似乎不是一个边缘用例!我只想允许对网站的特定部分进行受限访问:)
【解决方案2】:

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

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

希望这会有所帮助...

【讨论】:

  • 感谢您的回答。这绝对是解决问题的方法。但是,我希望找到一种仅使用 Web.config 的更通用的方法。按照您的方法,我需要在每个控制器/动作上使用 Authorize 属性......很多工作,而且很容易出错(如果我在添加新控制器或动作时忘记添加它)
  • @peval27 我添加了一个更新,你可以看看。
  • @peval27 另一方面,如果答案对您有帮助,请不要忘记投票并选择作为答案(如果解决了您的问题)...问候。
  • 感谢更新。我很快就会看看。 Upvote 既适用于问题,也适用于答案;)
  • 您发布的链接绝对可以解决问题。不知道为什么没有内置在 MVC web.config 中
猜你喜欢
  • 2018-09-22
  • 1970-01-01
  • 2019-12-06
  • 2011-02-02
  • 1970-01-01
  • 1970-01-01
  • 2011-06-04
  • 1970-01-01
  • 2021-02-19
相关资源
最近更新 更多