نمایش اشیاء موجود در View بر اساس دسترسیها در ASP.NET MVC
نویسنده: علی یگانه مقدم
تاریخ: ۱۳۹۷/۰۲/۱۷ ۱۲:۳۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
<button data-perm="true" data-controller="c" data-action="r" data-method="post" data-type="disable">Test 1</button> <button data-perm="true" data-controller="c" data-action="t" data-method="post">Test 2</button> <button data-perm="false" data-controller="c" data-action="r" data-method="post">Test 3</button> <a data-perm="true" data-controller="c" data-action="m" data-method="post">Test 4</a> <a data-perm="false" data-controller="c" data-action="m" data-method="post">Test 5</a> <a data-perm="true" data-controller="c" data-action="t" data-method="post">Test 6</a>
| ویژگی | توضیحات |
| perm | آیا نیاز به اعتبارسنجی دارد یا خیر؟ در صورتی که المانی مقدار Perm آن با مقدار true پر گردد، اعتبارسنجی روی آن اعمال خواهد شد. |
| controller | نام کنترلری که به آن دسترسی دارد. |
| action | نام اکشنی که به آن در کنترلر ذکر شده دسترسی دارد. |
| method | در صورتیکه دسترسی get و post و ... هر یک متفاوت باشد. |
| type | نحوه برخورد با المان غیرمجاز. در صورتیکه با disable مقداردهی شود، المان غیرفعال و در غیر اینصورت، از روی صفحه حذف میشود. |
سپس یک کلاس جدید ساخته و با ارث بری از ActionFilterAttribute، کار ساخت فیلتر را آغاز میکنیم:
public class AuthorizePage: ActionFilterAttribute
{
private HtmlTextWriter _htmlTextWriter;
private StringWriter _stringWriter;
private StringBuilder _stringBuilder;
private HttpWriter _output;
IAuthorization _auth;
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
_stringBuilder = new StringBuilder();
_stringWriter = new StringWriter(_stringBuilder);
_htmlTextWriter = new HtmlTextWriter(_stringWriter);
_output = (HttpWriter) filterContext.RequestContext.HttpContext.Response.Output;
filterContext.RequestContext.HttpContext.Response.Output = _htmlTextWriter;
_auth = new Auth();
}
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
var response = _stringBuilder.ToString();
response = AuthorizeTags(response);
_output.Write(response);
}
public string AuthorizeTags(string response)
{
var doc = GetHtmlDocument(response);
var nodes=doc.DocumentNode.SelectNodes("//*[@data-perm]");
if (nodes == null)
return response;
foreach(var node in nodes)
{
var dataPermission = node.Attributes["data-perm"];
if(!dataPermission.Value.TryBooleanParse())
{
continue;
}
var controller = node.Attributes["data-controller"].Value;
var action = node.Attributes["data-action"].Value;
var method = node.Attributes["data-method"].Value;
var access=_auth.Authorize(HttpContext.Current.User.Identity.Name , controller, action, method);
if (access)
continue;
var removeElm = true;
var type = node.Attributes["data-type"]?.Value;
if (type!=null && type.ToLower()== "disable")
{
removeElm = false;
}
if(removeElm)
{
node.Remove();
continue;
}
node.Attributes.Add("disabled", "true");
}
return doc.DocumentNode.OuterHtml;
}
private HtmlDocument GetHtmlDocument(string htmlContent)
{
var doc = new HtmlDocument
{
OptionOutputAsXml = true,
OptionDefaultStreamEncoding = Encoding.UTF8
};
doc.LoadHtml(htmlContent);
return doc;
}
} public interface IAuthorization
{
bool Authorize(string userId, string controller, string action, string method);
} protected void Application_Start()
{
GlobalFilters.Filters.Add(new AuthorizePage());
}