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

时间:2018-05-10 10:26:24

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

我为一个特定域组(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根本无法登录。

2 个答案:

答案 0 :(得分:1)

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

public function chart()
      {
        $result = \DB::table('users')
                    ->where('userType','=','Landlord')
                    ->orderBy('created_at', 'ASC')
                    ->get();
        return response()->json($result);
      }

然后像这样使用:

<script>
        var url = "{{url('/users')}}";
        var Name = new Array();
        var Email = new Array();
        $(document).ready(function(){
          $.get(url, function(response){
            response.forEach(function(data){
                Name.push(data.name);
                Email.push(data.email);
            });
            var ctx = document.getElementById("canvas").getContext('2d');

              var myPieChart = new Chart(ctx,{
                type: 'pie',

                data : {
                  datasets: [{
                      data: [Name,Email]
                }],

                // These labels appear in the legend and in the tooltips when hovering different arcs
                labels:  [Name, Email]
            }
              });

            });
          });

        </script>

您甚至可以扩展上述内容以获取参数。如果您可以将所有逻辑推送到一个过滤器中,那么您只需要记住将其添加到所有控制器中,并使用其保护所需的参数。

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", ""}
                               });

    }
}

答案 1 :(得分:1)

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

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

希望这会有所帮助......