我为一个特定域组(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根本无法登录。
答案 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。
希望这会有所帮助......