{"id":191218,"date":"2013-09-18T16:00:10","date_gmt":"2013-09-18T12:00:10","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=191218"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=191218","title":{"rendered":"<span class=\"post_title\">\u0420\u0430\u0437\u0434\u0435\u043b\u044f\u0439 \u0438 \u0432\u043b\u0430\u0441\u0442\u0432\u0443\u0439. \u0418\u043b\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0430\u0432 \u0434\u043b\u044f ASP MVC<\/span>"},"content":{"rendered":"<div class=\"content html_format\">   \t\u041e\u0447\u0435\u043d\u044c \u0447\u0430\u0441\u0442\u043e \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u044e\u0441\u044c \u0441 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0430\u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0440\u0430\u0437\u0434\u0435\u043b\u0430\u043c \u0441\u0430\u0439\u0442\u0430 \u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f.<br \/>  \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u043b\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 ASP MVC \u00ab\u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438\u00bb, \u043d\u043e, \u0441\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c, \u044f \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f \u0441 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0430\u0432. \u0415\u0441\u043b\u0438 \u0442\u0435\u0431\u0435, \u0443\u0432\u0430\u0436\u0430\u0435\u043c\u044b\u0439 %habrauser%, \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u0434\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434 \u043a\u0430\u0442.<br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<h4>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043b\u0438\u0440\u0438\u043a\u0438<\/h4>\n<p>  \u0412 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f \u0441 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0430\u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0440\u0430\u0437\u0434\u0435\u043b\u0430\u043c \u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c \u0441\u0430\u0439\u0442\u0430. \u042d\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0441\u0430\u0439\u0442 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u043e\u0442\u043f\u0443\u0441\u043a. \u0422\u0417 \u0431\u044b\u043b\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e, \u043d\u0430 \u0443\u0434\u0438\u0432\u043b\u0435\u043d\u0438\u0435, \u0445\u043e\u0440\u043e\u0448\u043e. \u0420\u0430\u0431\u043e\u0442\u0430 \u0448\u043b\u0430 \u0443\u0434\u0430\u0440\u043d\u044b\u043c\u0438 \u0442\u0435\u043c\u043f\u0430\u043c\u0438 \u0438 \u0443\u0436\u0435 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0441\u044f\u0446 \u0440\u0430\u0431\u043e\u0442\u044b \u0431\u044b\u043b \u0433\u043e\u0442\u043e\u0432 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f. \u0412\u0441\u0435 \u0431\u044b\u043b\u0438 \u0432 \u0432\u043e\u0441\u0442\u043e\u0440\u0433\u0435 \u0440\u043e\u0432\u043d\u043e \u0434\u043e \u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430, \u043a\u0430\u043a \u043d\u0435 \u043d\u0430\u0447\u0430\u043b\u0438\u0441\u044c \u00ab\u0443\u0442\u043e\u0447\u043d\u0435\u043d\u0438\u044f\u00bb \u043f\u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. \u0410 \u0442\u0430\u043a \u043a\u0430\u043a \u0431\u044e\u0440\u043e\u043a\u0440\u0430\u0442 \u0441\u0438\u0434\u0438\u0442 \u0432 \u043d\u0430\u0448\u0435\u043c \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0435 \u0441 \u0440\u043e\u0436\u0434\u0435\u043d\u0438\u044f, \u0431\u044b\u043b\u0430 \u043a\u0443\u0447\u0430 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u0438\u0439 \u0438 \u043e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0439, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u044b\u043b\u043e \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 \u0442\u0430\u043a\u043e\u0433\u043e: \u00ab\u0412\u0441\u0435 \u043e\u0442\u043b\u0438\u0447\u043d\u043e. \u041d\u043e \u0432\u043e\u0442 \u044d\u0442\u043e \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u0438\u0434\u0435\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c. \u0410 \u044d\u0442\u043e \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u0438\u0434\u0435\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440. \u0410 \u044d\u0442\u043e \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u0438\u0434\u0435\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0441\u043e\u0431\u043e \u0441\u0435\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u0438 \u043d\u0438\u043a\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0439!\u00bb. \u0418 \u044d\u0442\u043e, \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043d\u0435 \u043a\u043e\u043d\u0435\u0446 \u0431\u0443\u0440\u043d\u043e\u0439 \u0444\u0430\u043d\u0442\u0430\u0437\u0438\u0438 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430. <br \/>  \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c\u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u043e\u043b\u044f\u043c\u0438 \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430\u043c\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043c\u043e\u0436\u043d\u043e, \u043d\u043e \u043e\u0447\u0435\u043d\u044c \u0443\u0436 \u043c\u0443\u0442\u043e\u0440\u043d\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0432\u0437\u044f\u043b\u0441\u044f \u0437\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0430\u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c.<\/p>\n<h4>\u041f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u044f \u043a \u0440\u0430\u0431\u043e\u0442\u0435<\/h4>\n<p>  \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0431\u044b\u043b\u0438 \u0432\u044b\u0432\u0435\u0434\u0435\u043d\u044b \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043a \u043c\u043e\u0434\u0443\u043b\u044e.  <\/p>\n<ol>\n<li>\u041f\u0440\u043e\u0441\u0442\u043e\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u0430\u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043c\u0435\u0442\u043e\u0434\u0430\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432 (\u043f\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443 \u0440\u0430\u0431\u043e\u0442\u044b \u0430\u0442\u0442\u0440\u0438\u0431\u0443\u0442\u0430 Authorize)  <\/li>\n<li>\u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c \u0441\u0430\u0439\u0442\u0430  <\/li>\n<li>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0440\u043e\u043b\u0438 \u0441 \u043b\u044e\u0431\u044b\u043c\u0438 \u0432\u0430\u0440\u0438\u0430\u0446\u0438\u044f\u043c\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430  <\/li>\n<li>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445  <\/li>\n<\/ol>\n<p>  \u041f\u043e\u0442\u043e\u043c \u0431\u044b\u043b\u0430 \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0430 \u00ab\u0440\u0430\u0431\u043e\u0442\u0430\u00bb \u043f\u043e \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0441\u0445\u0435\u043c \u0438 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0439 \u043a\u0443\u0447\u0438 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u043f\u043e \u0442\u0435\u043c\u0435. \u0412 \u0438\u0442\u043e\u0433\u0435 \u0431\u044b\u043b\u0430 \u0432\u044b\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u0430 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f \u043c\u043e\u0434\u0443\u043b\u044f.<br \/>  \u0414\u0430\u043d\u043d\u044b\u0435, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043c\u043e\u0434\u0443\u043b\u044f, \u0431\u0443\u0434\u0443\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0432 \u0431\u0430\u0437\u0435 MSSQL (\u0430 \u043d\u0430 \u0447\u0435\u043c \u0436\u0435 \u0435\u0449\u0435, \u0435\u0441\u043b\u0438 \u043f\u0438\u0448\u0435\u043c \u043d\u0430 c#). \u0426\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435 \u0441\u0442\u0430\u043b \u0438\u0437-\u0437\u0430 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u0441\u0435\u0442\u0438 \u0438 \u0438\u0434\u0435\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f (\u0432 \u0442\u0435\u043e\u0440\u0438\u0438) \u043d\u0430 \u043b\u044e\u0431\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u0443\u0434\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0431\u0430\u0437\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0441\u0432\u043e\u0439 \u043d\u0430\u0431\u043e\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u044f. <br \/>  \u0422\u0430\u043a\u0436\u0435 \u0438\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u0438\u0434\u0435\u0438, \u0447\u0442\u043e \u043c\u043e\u0434\u0443\u043b\u044c \u0434\u043e\u043b\u0436\u0435\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043b\u044e\u0431\u044b\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c, \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0447\u0438\u0442\u0430\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 web.config \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d \u043c\u043e\u0434\u0443\u043b\u044c. <br \/>  \u041d\u0443 \u0438 \u043f\u0443\u0441\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044c \u0443\u043c\u0435\u0435\u0442 \u043f\u043e\u0434\u0433\u043e\u0442\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0441\u0435\u0431\u044f \u0431\u0430\u0437\u0443 \u0438 \u0434\u0435\u043b\u0430\u0435\u0442 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u043d\u043e\u0432\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u043a\u0430\u043a\u2026 \u043a\u0445\u043c. \u041d\u0443 \u0432\u044b \u043f\u043e\u043d\u044f\u043b\u0438.<br \/>  \u0418 \u043d\u0430 \u0432\u043a\u0443\u0441\u043d\u043e\u0435, \u043f\u0443\u0441\u0442\u044c \u043e\u043d \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0437\u0430\u043d\u043e\u0441\u0438\u0442 \u0432\u0441\u0435 \u0432\u043d\u043e\u0432\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u044b \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438 \u0434\u0430\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u00ab\u0441\u0443\u043f\u0435\u0440\u0430\u0434\u043c\u0438\u043d\u0443\u00bb, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043b\u0435\u0437\u0442\u044c \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438.<\/p>\n<h5>\u041d\u0430\u0447\u0430\u043b\u043e \u0440\u0430\u0431\u043e\u0442\u044b<\/h5>\n<p>  \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0445\u043e\u0447\u0443 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0430\u0440\u0443 \u0441\u043b\u043e\u0432 \u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0435\u043c\u0441\u044f \u043c\u043e\u0434\u0443\u043b\u0435. \u0414\u043b\u044f \u0441\u0432\u043e\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u0430\u043c\u043e\u043f\u0438\u0441\u043d\u044b\u0439 RoleProvider. \u0418 \u043f\u0440\u0438\u0447\u0438\u043d\u043e\u0439 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u043f\u044f\u0442\u044c \u0436\u0435 \u0441\u0442\u0430\u043b\u0438 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u0441\u0435\u0442\u0438. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u0441\u0434\u0435\u043b\u0430\u043d \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430\u043c\u0438 \u0438 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0430 \u043a \u0434\u043e\u043c\u0435\u043d\u043d\u043e\u043c\u0443 \u043b\u043e\u0433\u0438\u043d\u0443. \u041d\u0435 \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0447\u0435\u043c\u0443. \u042d\u0442\u043e \u0443\u0441\u0442\u043e\u044f\u0432\u0448\u0435\u0435\u0441\u044f \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432\u0435\u0449\u0435\u0439. <br \/>  \u0422\u0430\u043a \u0432\u043e\u0442, \u0434\u043b\u044f \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u043d\u0443\u0436\u0434 \u0432 \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a\u0435 \u0435\u0441\u0442\u044c \u0433\u0440\u0443\u043f\u043f\u044b \u0434\u043b\u044f \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u044b\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u0441\u0432\u043e\u0439 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 \u0440\u043e\u043b\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b \u0441\u0432\u043e\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043d\u043e \u043e\u043f\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b \u0433\u0440\u0443\u043f\u043f\u0430\u043c\u0438 \u0432 \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a\u0435 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435. \u0415\u0433\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u044f \u043d\u0435 \u0431\u0443\u0434\u0443, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u0441\u043e\u0431\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0430 \u043e\u043d \u043d\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u043e\u0432\u043e\u0433\u043e \u0432 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430 \u0432\u044b \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u0442\u0435. (\u0432 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430\u0445 \u043a\u043e\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0442\u044c\u0441\u044f \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0443 \u0438\u043c\u0435\u043d AuthLib, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 \u0440\u043e\u043b\u0435\u0439).<\/p>\n<p>  <i>\u041f\u043e\u043a\u0430 \u043d\u0435 \u043f\u043e\u0448\u0435\u043b \u043a\u043e\u0434, \u044f \u0445\u043e\u0447\u0443 \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0437\u0430 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u0438 \u0434\u0440\u0443\u0433\u043e\u0439 \u043c\u0443\u0441\u043e\u0440 \u0432 \u043a\u043e\u0434\u0435. \u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u043c(\u0432 \u0440\u0435\u0430\u043b\u0438\u044f\u0445 \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432) \u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0438\u0434\u0435\u0438.<\/i><\/p>\n<p>  \u041f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043b\u0430\u0441\u0441, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u0422\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0449\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c. <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043b\u0430\u0441\u0441 &#39;C\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a&#39;<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Data.SqlClient;  namespace Ekzo.BaseClasses {     public class Employee : IEquatable&lt;Employee&gt;     {         \/\/\/ &lt;summary&gt;         \/\/\/ \u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430 \u043f\u043e \u0411\u0414         \/\/\/ &lt;\/summary&gt;         public int Id { get; set; }         \/\/\/ &lt;summary&gt;         \/\/\/ \u0424\u0418\u041e \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430         \/\/\/ &lt;\/summary&gt;         public string Name { get; set; }               \/\/\/ &lt;summary&gt;         \/\/\/ \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430         \/\/\/ &lt;\/summary&gt;         \/\/\/ &lt;param name=&quot;id&quot;&gt;\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0438\u0437 \u0411\u0414&lt;\/param&gt;         public Employee(int id)         {             InitClass(id);         }         \/\/\/ &lt;summary&gt;         \/\/\/ \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430         \/\/\/ &lt;\/summary&gt;         \/\/\/ &lt;param name=&quot;employeeName&quot;&gt;\u0424\u0418\u041e \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430&lt;\/param&gt;         public Employee(string employeeName)         {                             using (SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[Ekzo.Web.Configuration.StringName].ConnectionString))                 {                     using (SqlCommand cmd = new SqlCommand(&quot;SELECT employee_id FROM employee WHERE employee_name LIKE @employeeName+'%' AND date_fired IS NULL&quot;, conn))                     {                         try                         {                             conn.Open();                             cmd.Parameters.AddWithValue(&quot;@employeeName&quot;, string.Join(&quot;%&quot;, employeeName.Split(char.Parse(&quot; &quot;))));                             SqlDataReader reader = cmd.ExecuteReader();                             while (reader.Read())                             {                                 this.Id = reader.GetInt32(0);                             }                             reader.Close();                         }                         catch (Exception ex)                         {                             if (Ekzo.Web.Configuration.s_log != null)                                 Ekzo.Web.Configuration.s_log.Error(&quot;[\u041e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438] [\u041e\u0448\u0438\u0431\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f]&quot;, ex);                         }                     }                 }             if (this.Id != 0)                 InitClass(this.Id);         }         \/\/\/ &lt;summary&gt;         \/\/\/ \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430         \/\/\/ &lt;\/summary&gt;         public Employee() { }         \/\/\/ &lt;summary&gt;         \/\/\/ \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u0435\u0439 \u043a\u043b\u0430\u0441\u0441\u0430         \/\/\/ &lt;\/summary&gt;         \/\/\/ &lt;param name=&quot;id&quot;&gt;\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430 \u043f\u043e \u0411\u0414&lt;\/param&gt;         private void InitClass(int id)         {                 this.Id = id;                 using (SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[Ekzo.Web.Configuration.StringName].ConnectionString))                 {                     using (SqlCommand cmd = new SqlCommand(&quot;SELECT employee_name FROM employee WHERE employee_id=@employeeID AND date_fired IS NULL&quot;, conn))                     {                         try                         {                             conn.Open();                             cmd.Parameters.AddWithValue(&quot;@employeeID&quot;, this.Id);                             SqlDataReader reader = cmd.ExecuteReader();                             while (reader.Read())                             {                                 this.Name = reader.GetString(0);                             }                             reader.Close();                          }                         catch (Exception ex)                         {                             if (Ekzo.Web.Configuration.s_log != null)                                 Ekzo.Web.Configuration.s_log.Error(&quot;[\u041e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438] [\u041e\u0448\u0438\u0431\u043a\u0430 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043b\u0430\u0441\u0441\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f]&quot;, ex);                         }                     }                 }          }          public bool Equals(Employee x, Employee y)         {             if (x.Name == y.Name && x.Id == y.Id)                 return true;             else                 return false;         }         public override int GetHashCode()         {             int hasEmployeeName = this.Name == null ? 0 : this.Name.GetHashCode();             int hasID = this.Id == 0 ? 0 : this.Id.GetHashCode();              return hasEmployeeName ^ hasID;         }         public bool Equals(Employee other)         {             if (this.Name == other.Name && this.Id == other.Id)                 return true;             else                 return false;         }          bool IEquatable&lt;Employee&gt;.Equals(Employee other)         {             if (this.Name == other.Name && this.Id == other.Id)                 return true;             else                 return false;         }     } } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043c \u043a\u043b\u0430\u0441\u0441\u044b, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u0438\u0441\u0442\u0435\u043c\u044b (\u0440\u0430\u0437\u0434\u0435\u043b\u044b, \u0441\u0441\u044b\u043b\u043a\u0438, \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u0442.\u0434.)<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043b\u0430\u0441\u0441 &#39;\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435&#39;<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Web;  namespace Ekzo.Web.Security.Utilization.Authorization {      \/\/\/ &lt;summary&gt;     \/\/\/ \u041a\u043b\u0430\u0441\u0441 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043c\u0435\u0442\u043e\u0434. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0439 \u0438\u043c\u0435\u043d\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0438 \u0440\u043e\u043b\u0438, \u0438\u043c\u0435\u044e\u0449\u0435\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043d\u0435\u043c\u0443.     \/\/\/ &lt;\/summary&gt;     public class Action     {         \/\/\/ &lt;summary&gt;         \/\/\/ \u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u043e \u0411\u0414         \/\/\/ &lt;\/summary&gt;         public int id { get; private set; }         \/\/\/ &lt;summary&gt;         \/\/\/ \u0413\u0440\u0443\u043f\u043f\u044b, \u043a \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434         \/\/\/ &lt;\/summary&gt;         private int[] _ActionGroups;         \/\/\/ &lt;summary&gt;         \/\/\/ \u0413\u0440\u0443\u043f\u043f\u044b, \u043a \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434         \/\/\/ &lt;\/summary&gt;         public ActionGroup[] ActionGroups         {             get             {                 List&lt;ActionGroup&gt; Groups = new List&lt;ActionGroup&gt;();                 if (_ActionGroups != null)                 {                     for (int i = 0; i &lt; _ActionGroups.Count(); i++)                         Groups.Add(new ActionGroup(_ActionGroups[i]));                     return Groups.ToArray();                 }                 return null;             }         }         \/\/\/ &lt;summary&gt;         \/\/\/ \u0418\u043c\u044f \u043c\u0435\u0442\u043e\u0434\u0430 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0440\u0430\u0437\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043a\u0430         \/\/\/ &lt;\/summary&gt;         public string ActionName { get; set; }         \/\/\/ &lt;summary&gt;         \/\/\/ \u0424\u043b\u0430\u0433 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u0430         \/\/\/ &lt;\/summary&gt;         public bool Active { get; private set; }          #region ClassBuilder         public Action() { }         public Action(string ActionName)         {             InitClass(ActionName);         }         public Action(int id)         {             InitClass(null, id);         }         private void InitClass(string name, int id = 0, int actionGroup = 0)         {             if (id != 0) this.id = id;             if (!string.IsNullOrEmpty(name)) this.ActionName = name;             \/\/this._ActionGroups = actionGroup;             using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[Configuration.ConnectionStringName].ConnectionString))             {                 using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(&quot;SELECT * FROM Authorization_Actions WHERE id=@id OR Name=@actionName&quot;, conn))                 {                     try                     {                         conn.Open();                         cmd.Parameters.AddWithValue(&quot;@id&quot;, id);                         cmd.Parameters.AddWithValue(&quot;@actionName&quot;, string.IsNullOrEmpty(name) ? &quot;&quot; : name);                         System.Data.SqlClient.SqlDataReader reader = cmd.ExecuteReader();                         while (reader.Read())                         {                             this.id = reader.GetInt32(0);                             this.ActionName = reader.GetString(1);                             this.Active = reader.GetBoolean(2);                         }                         reader.Close();                         List&lt;int&gt; actionGroups = new List&lt;int&gt;();                         cmd.CommandText = &quot;SELECT GroupID FROM Authorization_ActionToGroup WHERE ActionID=@id&quot;;                         cmd.Parameters.Clear();                         cmd.Parameters.AddWithValue(&quot;@id&quot;, this.id);                         reader = cmd.ExecuteReader();                         while (reader.Read())                             actionGroups.Add(reader.GetInt32(0));                          this._ActionGroups = actionGroups.ToArray();                     }                     catch (Exception ex)                     {                         if (Configuration.s_log != null)                             Configuration.s_log.Error(&quot;[\u041e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438] [\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f] &quot;, ex);                     }                 }             }         }         #endregion          \/\/\/ &lt;summary&gt;         \/\/\/ \u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u0430         \/\/\/ &lt;\/summary&gt;         public void Save()         {             using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[Configuration.ConnectionStringName].ConnectionString))             {                 using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(@&quot;                         IF((SELECT COUNT(*) FROM Authorization_Actions WHERE id=@id OR Name=@name)=0)                          BEGIN                             INSERT INTO Authorization_Actions(Name) VALUES(@name)                             INSERT INTO Authorization_ActionToGroup(ActionID,GroupID) VALUES((SELECT TOP(1) id FROM Authorization_Actions WHERE Name=@name),0)                          END                         ELSE                              UPDATE Authorization_Actions SET Name=@name, Active=@active                                                   SELECT * FROM Authorization_Actions WHERE Name=@name&quot;, conn))                 {                     try                     {                         conn.Open();                         if (!string.IsNullOrEmpty(this.ActionName) && this.id == 0) cmd.CommandText = cmd.CommandText.Replace(&quot;WHERE id=@id OR Name=@name&quot;, &quot;WHERE Name=@name&quot;);                         cmd.Parameters.AddWithValue(&quot;@id&quot;, this.id);                         cmd.Parameters.AddWithValue(&quot;@name&quot;, this.ActionName);                         cmd.Parameters.AddWithValue(&quot;@active&quot;, this.Active);                         \/\/cmd.Parameters.AddWithValue(&quot;@groupID&quot;, this._ActionGroup);                         System.Data.SqlClient.SqlDataReader reader = cmd.ExecuteReader();                         List&lt;int&gt; actionGroups = new List&lt;int&gt;();                         while (reader.Read())                         {                             this.id = reader.GetInt32(0);                             this.ActionName = reader.GetString(1);                             this.Active = reader.GetBoolean(2);                         }                         reader.Close();                         cmd.CommandText = &quot;SELECT GroupID FROM Authorization_ActionToGroup WHERE ActionID=@id&quot;;                         cmd.Parameters.Clear();                         cmd.Parameters.AddWithValue(&quot;@id&quot;, this.id);                         reader = cmd.ExecuteReader();                         while (reader.Read())                             actionGroups.Add(reader.GetInt32(0));                          this._ActionGroups = actionGroups.ToArray();                     }                     catch (Exception ex)                     {                         if (Configuration.s_log != null)                             Configuration.s_log.Error(&quot;[\u041e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438] [\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0432 \u0411\u0414] &quot;, ex);                     }                 }             }         }         \/\/\/ &lt;summary&gt;         \/\/\/ \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u0430         \/\/\/ &lt;\/summary&gt;         public void Delete()         {             using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[Configuration.ConnectionStringName].ConnectionString))             {                 using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(&quot;DELETE FROM Authorization_Actions WHERE id=@id&quot;, conn))                 {                     try                     {                         conn.Open();                         cmd.Parameters.AddWithValue(&quot;@id&quot;, this.id);                         cmd.ExecuteNonQuery();                         cmd.CommandText = &quot;DELETE FROM Autorization_ActionToGroup WHERE ActionID=@id&quot;;                         cmd.ExecuteNonQuery();                     }                     catch (Exception ex)                     {                         if (Configuration.s_log != null)                             Configuration.s_log.Error(&quot;[\u041e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438] [\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0438\u0437 \u0411\u0414] &quot;, ex);                     }                 }             }         }         \/\/\/ &lt;summary&gt;         \/\/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u0430         \/\/\/ &lt;\/summary&gt;         \/\/\/ &lt;returns&gt;&lt;\/returns&gt;         public bool IsExist()         {             return IsExist(this.ActionName);         }         \/\/\/ &lt;summary&gt;         \/\/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u0430         \/\/\/ &lt;\/summary&gt;         \/\/\/ &lt;param name=&quot;ActionName&quot;&gt;\u0418\u043c\u044f \u043c\u0435\u0442\u043e\u0434\u0430&lt;\/param&gt;         \/\/\/ &lt;returns&gt;&lt;\/returns&gt;         public static bool IsExist(string ActionName)         {             bool result = false;             using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[Configuration.ConnectionStringName].ConnectionString))             {                 using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(&quot;SELECT COUNT(*) FROM Authorization_Actions WHERE Name=@name&quot;, conn))                 {                     try                     {                         conn.Open();                         cmd.Parameters.AddWithValue(&quot;@name&quot;, ActionName);                         System.Data.SqlClient.SqlDataReader reader = cmd.ExecuteReader();                         while (reader.Read())                             result = reader.GetInt32(0) == 0 ? false : true;                     }                     catch (Exception ex)                     {                         if (Configuration.s_log != null)                             Configuration.s_log.Error(&quot;[\u041e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438] [\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0432 \u0411\u0414] &quot;, ex);                     }                 }             }             return result;         }         \/\/\/ &lt;summary&gt;         \/\/\/ \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u0441\u0435\u0445 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432         \/\/\/ &lt;\/summary&gt;         \/\/\/ &lt;returns&gt;&lt;\/returns&gt;         public static List&lt;Action&gt; GetAllActions()         {             List&lt;Action&gt; result = new List&lt;Action&gt;();             using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[Configuration.ConnectionStringName].ConnectionString))             {                 using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(&quot;SELECT id FROM Authorization_Actions ORDER BY Name &quot;, conn))                 {                     try                     {                         conn.Open();                         System.Data.SqlClient.SqlDataReader reader = cmd.ExecuteReader();                         while (reader.Read())                             result.Add(new Action(reader.GetInt32(0)));                     }                     catch (Exception ex)                     {                         if (Configuration.s_log != null)                             Configuration.s_log.Error(&quot;[\u041e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438] [\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439] &quot;, ex);                     }                 }             }             return result;         }         \/\/\/ &lt;summary&gt;         \/\/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 \u0432 \u0433\u0440\u0443\u043f\u043f\u0443         \/\/\/ &lt;\/summary&gt;         \/\/\/ &lt;param name=&quot;groupID&quot;&gt;&lt;\/param&gt;         public void AddToGroup(int groupID)         {              using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[Configuration.ConnectionStringName].ConnectionString))             {                 using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(@&quot;                         IF((SELECT COUNT(*) FROM Authorization_ActionToGroup WHERE ActionID=@action AND GroupID=@group)=0)                            INSERT INTO Authorization_ActionToGroup(ActionID,GroupID) VALUES(@action,@group)&quot;, conn))                 {                     try                     {                         conn.Open();                         cmd.Parameters.AddWithValue(&quot;@action&quot;, groupID);                         cmd.Parameters.AddWithValue(&quot;@group&quot;, this.id);                         cmd.ExecuteNonQuery();                         new Action(this.id);                     }                     catch (Exception ex)                     {                         if (Configuration.s_log != null)                             Configuration.s_log.Error(&quot;[\u041e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438] [\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0432 \u0433\u0440\u0443\u043f\u043f\u0443] &quot;, ex);                     }                 }             }         }     } } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043b\u0430\u0441\u0441 &#39;\u0413\u0440\u0443\u043f\u043f\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439&#39;<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">using System; using System.Collections.Generic; using System.Linq; using System.Text;  namespace Ekzo.Web.Security.Utilization.Authorization {     \/\/\/ &lt;summary&gt;     \/\/\/ \u041a\u043b\u0430\u0441\u0441 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0433\u0440\u0443\u043f\u043f\u044b \u043c\u0435\u0442\u043e\u0434\u043e\u0432     \/\/\/ &lt;\/summary&gt;     public class ActionGroup     {         \/\/\/ &lt;summary&gt;         \/\/\/ \u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0433\u0440\u0443\u043f\u043f\u044b \u0432 \u0411\u0414         \/\/\/ &lt;\/summary&gt;         public int id { get; private set; }         \/\/\/ &lt;summary&gt;         \/\/\/ \u0421\u043f\u0438\u0441\u043e\u043a \u0440\u043e\u043b\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0433\u0440\u0443\u043f\u043f\u0435         \/\/\/ &lt;\/summary&gt;         public SystemRole[] Roles { get; private set; }         \/\/\/ &lt;summary&gt;         \/\/\/ \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0433\u0440\u0443\u043f\u043f\u044b         \/\/\/ &lt;\/summary&gt;         public string Name { get; private set; }         \/\/\/ &lt;summary&gt;         \/\/\/ \u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0433\u0440\u0443\u043f\u043f\u044b. \u0415\u0441\u043b\u0438 \u0433\u0440\u0443\u043f\u043f\u0430 \u043d\u0435 \u0430\u043a\u0442\u0438\u0432\u043d\u044b, \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u044e\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.         \/\/\/ &lt;\/summary&gt;         public bool Active { get; set; }         \/\/\/ &lt;summary&gt;         \/\/\/ \u041c\u0435\u0442\u043e\u0434\u044b \u0433\u0440\u0443\u043f\u043f\u044b.         \/\/\/ &lt;\/summary&gt;         public Action[] GroupActions { get; private set; }         #region ClassBuilder         public ActionGroup(int id)         {             InitClass(null, id);         }         public ActionGroup(string name) { InitClass(name); }         private void InitClass(string name, int id = 0)         {             if (id != 0) this.id = id;             if (!string.IsNullOrEmpty(name)) this.Name = name;             using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[Configuration.ConnectionStringName].ConnectionString))             {                 using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(&quot;SELECT * FROM Authorization_ActionGroups WHERE id=@id OR Name=@groupName&quot;, conn))                 {                     try                     {                         conn.Open();                         if (!string.IsNullOrEmpty(name) && id == 0) cmd.CommandText = &quot;SELECT * FROM Authorization_ActionGroups WHERE Name=@groupName&quot;;                         cmd.Parameters.AddWithValue(&quot;@id&quot;, this.id);                         cmd.Parameters.AddWithValue(&quot;@groupName&quot;, this.Name == null ? &quot;&quot; : this.Name);                         System.Data.SqlClient.SqlDataReader reader = cmd.ExecuteReader();                         while (reader.Read())                         {                             this.id = reader.GetInt32(0);                             if (string.IsNullOrEmpty(this.Name)) this.Name = reader.GetString(1);                             this.Active = reader.GetBoolean(2);                         }                         reader.Close();                         cmd.CommandText = &quot;SELECT * FROM Authorization_RoleToActionGroup WHERE ActionGroup=@groupID&quot;;                         cmd.Parameters.Clear();                         cmd.Parameters.AddWithValue(&quot;@groupID&quot;, this.id);                         reader = cmd.ExecuteReader();                         List&lt;SystemRole&gt; rolesList = new List&lt;SystemRole&gt;();                         while (reader.Read())                             rolesList.Add(new SystemRole(this.id, reader.GetString(2)));                         this.Roles = rolesList.ToArray();                         reader.Close();                         cmd.Parameters.Clear();                         cmd.Parameters.AddWithValue(&quot;@id&quot;, this.id);                         List&lt;Action&gt; actionsList = new List&lt;Action&gt;();                         cmd.CommandText = &quot;SELECT ActionID FROM Authorization_ActionToGroup WHERE GroupID=@id&quot;;                         reader = cmd.ExecuteReader();                         while (reader.Read())                         {                             actionsList.Add(new Action(reader.GetInt32(0)));                         }                         this.GroupActions = actionsList.Distinct().ToArray();                     }                     catch (Exception ex)                     {                         if (Configuration.s_log != null)                             Configuration.s_log.Error(&quot;[\u041e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438] [\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f] &quot;, ex);                     }                 }             }         }         #endregion         \/\/\/ &lt;summary&gt;         \/\/\/ \u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0433\u0440\u0443\u043f\u043f\u044b         \/\/\/ &lt;\/summary&gt;         public void Save()         {             using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[Configuration.ConnectionStringName].ConnectionString))             {                 using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(@&quot;                         IF((SELECT COUNT(*) FROM Authorization_ActionGroups WHERE Name=@name)=0)                              INSERT INTO Authorization_ActionGroups(Name) VALUES(@name)                          ELSE                              UPDATE Authorization_ActionGroups SET Name=@name, Active=@active WHERE id=@id                                               SELECT * FROM Authorization_ActionGroups WHERE Name=@name&quot;, conn))                 {                     try                     {                         conn.Open();                         cmd.Parameters.AddWithValue(&quot;@id&quot;, this.id);                         cmd.Parameters.AddWithValue(&quot;@name&quot;, this.Name);                         cmd.Parameters.AddWithValue(&quot;@active&quot;, this.Active);                         System.Data.SqlClient.SqlDataReader reader = cmd.ExecuteReader();                         while (reader.Read())                         {                             this.id = reader.GetInt32(0);                             this.Name = reader.GetString(1);                             this.Active = reader.GetBoolean(2);                         }                         reader.Close();                         cmd.CommandText = &quot;SELECT * FROM Authorization_RoleToActionGroup WHERE ActionGroup=@id&quot;;                         reader = cmd.ExecuteReader();                         List&lt;SystemRole&gt; rolesList = new List&lt;SystemRole&gt;();                         while (reader.Read())                             rolesList.Add(new SystemRole(reader.GetString(2)));                         this.Roles = rolesList.ToArray();                     }                     catch (Exception ex)                     {                         if (Configuration.s_log != null)                             Configuration.s_log.Error(&quot;[\u041e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438] [\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0433\u0440\u0443\u043f\u043f\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439] &quot;, ex);                     }                 }             }         }         \/\/\/ &lt;summary&gt;         \/\/\/ \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0433\u0440\u0443\u043f\u043f\u044b.         \/\/\/ &lt;\/summary&gt;         \/\/\/ &lt;remarks&gt;\u041f\u0440\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u0433\u0440\u0443\u043f\u043f\u044b \u0442\u0430\u043a\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.&lt;\/remarks&gt;         public void Delete()         {             using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[Configuration.ConnectionStringName].ConnectionString))             {                 using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(&quot;DELETE FROM Authorization_ActionGroups WHERE id=@id&quot;, conn))                 {                     try                     {                         conn.Open();                         cmd.Parameters.AddWithValue(&quot;@id&quot;, this.id);                         cmd.ExecuteNonQuery();                         cmd.CommandText = &quot;DELETE FROM Authorization_RoleToActionGroup WHERE ActionGroup=@id&quot;;                         cmd.ExecuteNonQuery();                         cmd.CommandText = &quot;DELETE FROM Authorization_ActionToGroup WHERE GroupID=@id&quot;;                         cmd.ExecuteNonQuery();                     }                     catch (Exception ex)                     {                         if (Configuration.s_log != null)                             Configuration.s_log.Error(&quot;[\u041e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438] [\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0433\u0440\u0443\u043f\u043f\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439] &quot;, ex);                     }                 }             }         }          \/\/\/ &lt;summary&gt;         \/\/\/ \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 \u0438\u0437 \u0433\u0440\u0443\u043f\u043f\u044b         \/\/\/ &lt;\/summary&gt;         \/\/\/ &lt;param name=&quot;actionID&quot;&gt;\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043c\u0435\u0442\u043e\u0434\u0430&lt;\/param&gt;         public void DeleteAction(int actionID)         {              using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[Configuration.ConnectionStringName].ConnectionString))             {                 using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(&quot;DELETE FROM Authorization_ActionToGroup WHERE ActionID=@action AND GroupID=@group&quot;, conn))                 {                     try                     {                         conn.Open();                         cmd.Parameters.AddWithValue(&quot;@action&quot;, actionID);                         cmd.Parameters.AddWithValue(&quot;@group&quot;, this.id);                         cmd.ExecuteNonQuery();                     }                     catch (Exception ex)                     {                         if (Configuration.s_log != null)                             Configuration.s_log.Error(&quot;[\u041e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438] [\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0438\u0437 \u0433\u0440\u0443\u043f\u043f\u044b] &quot;, ex);                     }                 }             }         }         \/\/\/ &lt;summary&gt;         \/\/\/ \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0440\u043e\u043b\u0438 \u0438\u0437 \u0433\u0440\u0443\u043f\u043f\u044b         \/\/\/ &lt;\/summary&gt;         \/\/\/ &lt;param name=&quot;roleID&quot;&gt;\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0440\u043e\u043b\u0438&lt;\/param&gt;         public void DeleteRole(int roleID)         {             string roleName = &quot;&quot;;             using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[Ekzo.Web.Configuration.StringName].ConnectionString))             {                 using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(&quot;SELECT group_name FROM groups WHERE group_id=@id&quot;, conn))                 {                     try                     {                         conn.Open();                         cmd.Parameters.AddWithValue(&quot;@id&quot;, roleID);                         System.Data.SqlClient.SqlDataReader reader = cmd.ExecuteReader();                         while (reader.Read())                             roleName = reader.GetString(0);                     }                     catch (Exception ex)                     {                         if (Configuration.s_log != null)                             Configuration.s_log.Error(&quot;[\u041e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438] [\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0440\u043e\u043b\u0438 \u0438\u0437 \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a\u0430] &quot;, ex);                     }                 }             }              using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[Configuration.ConnectionStringName].ConnectionString))             {                 using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(&quot;DELETE FROM Authorization_RoleToActionGroup WHERE ActionGroup=@group AND Role=@roleName&quot;, conn))                 {                     try                     {                         conn.Open();                         cmd.Parameters.AddWithValue(&quot;@roleName&quot;, roleName);                         cmd.Parameters.AddWithValue(&quot;@group&quot;, this.id);                         cmd.ExecuteNonQuery();                     }                     catch (Exception ex)                     {                         if (Configuration.s_log != null)                             Configuration.s_log.Error(&quot;[\u041e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438] [\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0440\u043e\u043b\u0438 \u0438\u0437 \u0433\u0440\u0443\u043f\u043f\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439] &quot;, ex);                     }                 }             }         }         \/\/\/ &lt;summary&gt;         \/\/\/ \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u0441\u0435\u0445 \u0433\u0440\u0443\u043f\u043f         \/\/\/ &lt;\/summary&gt;         \/\/\/ &lt;returns&gt;&lt;\/returns&gt;         public static List&lt;ActionGroup&gt; GetAllgroups()         {             List&lt;ActionGroup&gt; result = new List&lt;ActionGroup&gt;();              using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[Configuration.ConnectionStringName].ConnectionString))             {                 using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(&quot;SELECT id FROM Authorization_ActionGroups&quot;, conn))                 {                     try                     {                         conn.Open();                         System.Data.SqlClient.SqlDataReader reader = cmd.ExecuteReader();                         while (reader.Read())                             result.Add(new ActionGroup(reader.GetInt32(0)));                     }                     catch (Exception ex)                     {                         if (Configuration.s_log != null)                             Configuration.s_log.Error(&quot;[\u041e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438] [\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0433\u0440\u0443\u043f\u043f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439] &quot;, ex);                     }                 }             }             return result;         }     } }  <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043b\u0430\u0441\u0441 &#39;\u042d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f&#39;<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">using System; using System.Collections.Generic; using System.Linq; using System.Text;  namespace Ekzo.Web.Security.Utilization.Authorization {     \/\/\/ &lt;summary&gt;     \/\/\/ \u041a\u043b\u0430\u0441\u0441 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u043c\u0435\u044e\u0442 \u0440\u0430\u0437\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u0430     \/\/\/ &lt;\/summary&gt;     public class PageControl     {         \/\/\/ &lt;summary&gt;         \/\/\/ \u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0430 \u043f\u043e \u0411\u0414 \u0440\u0430\u0437\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u0430\u0432         \/\/\/ &lt;\/summary&gt;         public int id { get; private set; }         \/\/\/ &lt;summary&gt;         \/\/\/ \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0430 \u0432 \u0411\u0414         \/\/\/ &lt;\/summary&gt;         public string Name { get; set; }         \/\/\/ &lt;summary&gt;         \/\/\/ \u0413\u0440\u0443\u043f\u043f\u044b, \u043a \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d \u043a\u043e\u043d\u0442\u0440\u043e\u043b         \/\/\/ &lt;\/summary&gt;         public List&lt;PageControlsGroup&gt; Groups { get; set; }          #region ClassBuilder         public PageControl(int id)         {             InitClass(id, null);         }         public PageControl(string name)         {             InitClass(0, name);         }         private void InitClass(int id, string Name)         {             using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[Configuration.ConnectionStringName].ConnectionString))             {                 \/\/\u0415\u0441\u043b\u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b \u0435\u0449\u0435 \u043d\u0435 \u0437\u0430\u043d\u0435\u0441\u0435\u043d \u0432 \u0411\u0414, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u0433\u043e \u0432 \u0441\u043f\u0438\u0441\u043e\u043a                 using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(@&quot;IF((SELECT COUNT(*) FROM Authorization_Controls WHERE Name=@name OR id=@id)=0)                                                                                                                              INSERT INTO Authorization_Controls(Name) VALUES (@name)&quot;, conn))                 {                     try                     {                         conn.Open();                         cmd.Parameters.AddWithValue(&quot;@name&quot;, Name == null ? &quot;&quot; : Name);                         cmd.Parameters.AddWithValue(&quot;@id&quot;, id);                         cmd.ExecuteNonQuery();                         cmd.CommandText = &quot;SELECT id,Name FROM Authorization_Controls WHERE Name=@name OR id=@id&quot;;                         System.Data.SqlClient.SqlDataReader reader = cmd.ExecuteReader();                         while (reader.Read())                         {                             this.id = reader.GetInt32(0);                             this.Name = reader.GetString(1);                         }                         reader.Close();                         \/\/\u0415\u0441\u043b\u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b \u0435\u0449\u0435 \u043d\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0432 \u0433\u0440\u0443\u043f\u043f\u0443 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043e\u0432 \u0441\u0443\u043f\u0435\u0440\u0430\u0434\u043c\u0438\u043d\u0430, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c                         \/\/\u0413\u0440\u0443\u043f\u043f\u0430 \u0441\u0443\u043f\u0435\u0440\u0430\u0434\u043c\u0438\u043d\u0430 -1                         cmd.CommandText = &quot;IF((SELECT COUNT(*) FROM Authorization_ControlToGroup WHERE ControlID=@id AND GroupID=-1)=0) INSERT INTO Authorization_ControlToGroup(ControlID,GroupID) VALUES(@id,-1)&quot;;                         cmd.Parameters.Clear();                         cmd.Parameters.AddWithValue(&quot;@id&quot;, this.id);                         cmd.Parameters.AddWithValue(&quot;@name&quot;, this.Name);                         cmd.ExecuteNonQuery();                     }                     catch (Exception ex)                     {                         if (Configuration.s_log != null)                             Configuration.s_log.Error(&quot;[\u041e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438] [\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f] &quot;, ex);                     }                 }             }              this.Groups = new List&lt;PageControlsGroup&gt;();             List&lt;int&gt; groupsIDs = new List&lt;int&gt;();              using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[Configuration.ConnectionStringName].ConnectionString))             {                 using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(&quot;SELECT GroupID FROM Authorization_ControlToGroup WHERE ControlID=@id&quot;, conn))                 {                     try                     {                         conn.Open();                         cmd.Parameters.AddWithValue(&quot;@id&quot;, this.id);                         System.Data.SqlClient.SqlDataReader reader = cmd.ExecuteReader();                         while (reader.Read())                             groupsIDs.Add(reader.GetInt32(0));                     }                     catch (Exception ex)                     {                         if (Configuration.s_log != null)                             Configuration.s_log.Error(&quot;[\u041e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438] [\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f] &quot;, ex);                     }                 }             }              for (int i = 0; i &lt; groupsIDs.Count; i++)                 this.Groups.Add(new PageControlsGroup(groupsIDs[i]));          }         #endregion          \/\/\/ &lt;summary&gt;         \/\/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0430 \u0432 \u0433\u0440\u0443\u043f\u043f\u0443         \/\/\/ &lt;\/summary&gt;         \/\/\/ &lt;param name=&quot;groupID&quot;&gt;&lt;\/param&gt;         public void AddToGroup(int groupID)         {             using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[Configuration.ConnectionStringName].ConnectionString))             {                 using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(@&quot;IF((SELECT COUNT(*) FROM Authorization_ControlToGroup WHERE ControlID=@id AND GroupID=@group)=0)                                                                                                             INSERT INTO Authorization_ControlToGroup(ControlID,GroupID) VALUES(@id,@group)&quot;, conn))                 {                     try                     {                         conn.Open();                         cmd.Parameters.AddWithValue(&quot;@id&quot;, this.id);                         cmd.Parameters.AddWithValue(&quot;@group&quot;, groupID);                         cmd.ExecuteNonQuery();                     }                     catch (Exception ex)                     {                         if (Configuration.s_log != null)                             Configuration.s_log.Error(&quot;[\u041e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438] [\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u0433\u0440\u0443\u043f\u043f\u0443] &quot;, ex);                     }                 }             }         }         \/\/\/ &lt;summary&gt;         \/\/\/ \u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0430         \/\/\/ &lt;\/summary&gt;         public void Save()         {             string commandText = this.id == 0 ? &quot;INSERT INTO Authorization_Controls (Name) VALUES(@name)&quot; : &quot;UPDATE Authorization_Controls SET Name=@name WHERE id=@id&quot;;             using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[Configuration.ConnectionStringName].ConnectionString))             {                 using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(commandText, conn))                 {                     try                     {                         conn.Open();                         cmd.Parameters.AddWithValue(&quot;@name&quot;, this.Name);                         cmd.Parameters.AddWithValue(&quot;@id&quot;, this.id);                         cmd.ExecuteNonQuery();                         cmd.CommandText = &quot;IF((SELECT COUNT(*) FROM Authorization_ControlToGroup WHERE ControlID=(SELECT TOP(1) id FROM Authorization_Controls WHERE Name=@name) AND GroupID=-1)=0) INSERT INTO Authorization_ControlToGroup(ControlID,GroupID) VALUES(SELECT TOP(1) id FROM Authorization_Controls WHERE Name=@name,-1)&quot;;                         cmd.ExecuteNonQuery();                     }                     catch (Exception ex)                     {                         if (Configuration.s_log != null)                             Configuration.s_log.Error(&quot;[\u041e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438] [\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f] &quot;, ex);                     }                 }             }         }         \/\/\/ &lt;summary&gt;         \/\/\/ \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0430         \/\/\/ &lt;\/summary&gt;         public void Delete()         {             if (this.id == 0) return;              using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[Configuration.ConnectionStringName].ConnectionString))             {                 using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(&quot;DELETE FROM Authorization_Controls WHERE id=@id&quot;, conn))                 {                     try                     {                         conn.Open();                         cmd.Parameters.AddWithValue(&quot;@id&quot;, this.id);                         cmd.ExecuteNonQuery();                     }                     catch (Exception ex)                     {                         if (Configuration.s_log != null)                             Configuration.s_log.Error(&quot;[\u041e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438] [\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f] &quot;, ex);                     }                 }             }         }         \/\/\/ &lt;summary&gt;         \/\/\/ \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u0441\u0435\u0445 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043e\u0432         \/\/\/ &lt;\/summary&gt;         \/\/\/ &lt;returns&gt;&lt;\/returns&gt;         public static PageControl[] GetAllControls()         {             List&lt;PageControl&gt; result = new List&lt;PageControl&gt;();             List&lt;int&gt; controlsIDs = new List&lt;int&gt;();             using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[Configuration.ConnectionStringName].ConnectionString))             {                 using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(&quot;SELECT id FROM Authorization_Controls ORDER BY Name&quot;, conn))                 {                     try                     {                         conn.Open();                         System.Data.SqlClient.SqlDataReader reader = cmd.ExecuteReader();                         while (reader.Read())                             controlsIDs.Add(reader.GetInt32(0));                     }                     catch (Exception ex)                     {                         if (Configuration.s_log != null)                             Configuration.s_log.Error(&quot;[\u041e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438] [\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f] &quot;, ex);                     }                 }             }             for (int i = 0; i &lt; controlsIDs.Count; i++)                 result.Add(new PageControl(controlsIDs[i]));             return result.ToArray();         }      } } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043b\u0430\u0441\u0441 &#39;\u0413\u0440\u0443\u043f\u043f\u044b \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043e\u0432&#39;<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">using System; using System.Collections.Generic; using System.Linq; using System.Text;  namespace Ekzo.Web.Security.Utilization.Authorization {     \/\/\/ &lt;summary&gt;     \/\/\/ \u041a\u043b\u0430\u0441\u0441 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0433\u0440\u0443\u043f\u043f\u0443 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043e\u0432     \/\/\/ &lt;\/summary&gt;     public class PageControlsGroup : IEquatable&lt;PageControlsGroup&gt;, IEqualityComparer&lt;PageControlsGroup&gt;     {         \/\/\/ &lt;summary&gt;         \/\/\/ \u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0433\u0440\u0443\u043f\u043f\u044b \u043f\u043e \u0411\u0414 \u0440\u0430\u0437\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f  \u043f\u0440\u0430\u0432\u0434         \/\/\/ &lt;\/summary&gt;         public int id { get; private set; }         \/\/\/ &lt;summary&gt;         \/\/\/ \u0418\u043c\u044f \u0433\u0440\u0443\u043f\u043f\u044b         \/\/\/ &lt;\/summary&gt;         public string Name { get; set; }         \/\/\/ &lt;summary&gt;         \/\/\/ \u0421\u043f\u0438\u0441\u043e\u043a \u0440\u043e\u043b\u0435\u0439, \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0449\u0438\u0445 \u0433\u0440\u0443\u043f\u043f\u0435         \/\/\/ &lt;\/summary&gt;         public List&lt;ControlsGroupRole&gt; Roles { get; set; }          #region ClassBuilder         public PageControlsGroup(int id)         {             InitClass(id, &quot;&quot;);         }         public PageControlsGroup(string Name)         {             this.Name = Name;             InitClass(0, Name);         }         public PageControlsGroup(int id, string Name)         {             this.id = id;             this.Name = Name;             this.Roles = new PageControlsGroup(id).Roles;         }          private void InitClass(int id, string name)         {             \/\/this.Controls = new List&lt;PageControl&gt;();             this.Roles = new List&lt;ControlsGroupRole&gt;();             List&lt;int&gt; pageControls = new List&lt;int&gt;();             using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[Configuration.ConnectionStringName].ConnectionString))             {                 using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(&quot;SELECT * FROM Authorization_ControlsGroup WHERE id=@id OR Name=@name&quot;, conn))                 {                     try                     {                         conn.Open();                         cmd.Parameters.AddWithValue(&quot;@id&quot;, id);                         cmd.Parameters.AddWithValue(&quot;@name&quot;, name);                         System.Data.SqlClient.SqlDataReader reader = cmd.ExecuteReader();                         while (reader.Read())                         {                             this.id = reader.GetInt32(0);                             this.Name = reader.GetString(1);                         }                         reader.Close();                         cmd.CommandText = @&quot;SELECT Authorization_Controls.id AS ControlID                                             FROM   Authorization_ControlToGroup INNER JOIN                                             Authorization_ControlsGroup ON Authorization_ControlToGroup.GroupID = Authorization_ControlsGroup.id INNER JOIN                                             Authorization_Controls ON Authorization_ControlToGroup.ControlID = Authorization_Controls.id                                             WHERE Authorization_ControlsGroup.id=@id OR Authorization_ControlsGroup.Name=@name&quot;;                         reader = cmd.ExecuteReader();                         while (reader.Read())                             pageControls.Add(reader.GetInt32(0));                     }                     catch (Exception ex)                     {                         if (Configuration.s_log != null)                             Configuration.s_log.Error(&quot;[\u041e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438] [\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u0430 \u0433\u0440\u0443\u043f\u043f\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f] &quot;, ex);                     }                 }             }               \/\/for(int i=0;i&lt;pageControls.Count;i++)             \/\/    this.Controls.Add(new PageControl(pageControls[i]));              List&lt;int&gt; groupRoles = new List&lt;int&gt;();             using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[Configuration.ConnectionStringName].ConnectionString))             {                 using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(&quot;SELECT RoleID FROM Authorization_RoleToControlGroup WHERE GroupID=@id&quot;, conn))                 {                     try                     {                         conn.Open();                         cmd.Parameters.AddWithValue(&quot;@id&quot;, this.id);                         System.Data.SqlClient.SqlDataReader reader = cmd.ExecuteReader();                         while (reader.Read())                             groupRoles.Add(reader.GetInt32(0));                     }                     catch (Exception ex)                     {                         if (Configuration.s_log != null)                             Configuration.s_log.Error(&quot;[\u041e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438] [\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0440\u043e\u043b\u0435\u0439 \u0433\u0440\u0443\u043f\u043f\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f] &quot;, ex);                     }                 }             }             for (int i = 0; i &lt; groupRoles.Count; i++)                 this.Roles.Add(new ControlsGroupRole(groupRoles[i], this.id));         }         #endregion          \/\/\/ &lt;summary&gt;         \/\/\/ \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438 \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u0441\u0435\u0445 \u0433\u0440\u0443\u043f\u043f         \/\/\/ &lt;\/summary&gt;         \/\/\/ &lt;returns&gt;&lt;\/returns&gt;         public static PageControlsGroup[] GetAllGroups()         {             List&lt;PageControlsGroup&gt; result = new List&lt;PageControlsGroup&gt;();              using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[Configuration.ConnectionStringName].ConnectionString))             {                 using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(&quot;SELECT * FROM Authorization_ControlsGroup&quot;, conn))                 {                     try                     {                         conn.Open();                         System.Data.SqlClient.SqlDataReader reader = cmd.ExecuteReader();                         while (reader.Read())                             result.Add(new PageControlsGroup(reader.GetInt32(0), reader.GetString(1)));                     }                     catch (Exception ex)                     {                         if (Configuration.s_log != null)                             Configuration.s_log.Error(&quot;[\u041e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438] [\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0433\u0440\u0443\u043f\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f] &quot;, ex);                     }                 }             }              return result.ToArray();         }         \/\/\/ &lt;summary&gt;         \/\/\/ \u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0433\u0440\u0443\u043f\u043f\u044b         \/\/\/ &lt;\/summary&gt;         public void Save()         {              using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[Configuration.ConnectionStringName].ConnectionString))             {                 using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(&quot;IF((SELECT COUNT(*) FROM Authorization_ControlsGroup WHERE Name=@name)=0) INSERT INTO Authorization_ControlsGroup(Name) VALUES(@name)&quot;, conn))                 {                     try                     {                         conn.Open();                         cmd.Parameters.AddWithValue(&quot;@name&quot;, this.Name);                         cmd.ExecuteNonQuery();                     }                     catch (Exception ex)                     {                         if (Configuration.s_log != null)                             Configuration.s_log.Error(&quot;[\u041e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438] [\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0433\u0440\u0443\u043f\u043f\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f] &quot;, ex);                     }                 }             }              PageControlsGroup newGroup = new PageControlsGroup(this.Name);             this.id = newGroup.id;             this.Roles = newGroup.Roles;             newGroup = null;          }         \/\/\/ &lt;summary&gt;         \/\/\/ \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0433\u0440\u0443\u043f\u043f\u044b         \/\/\/ &lt;\/summary&gt;         public void Delete()         {             if (this.id != 0)                 using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[Configuration.ConnectionStringName].ConnectionString))                 {                     using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(&quot;DELETE FROM Authorization_ControlsGroup WHERE id=@id&quot;, conn))                     {                         try                         {                             conn.Open();                             cmd.Parameters.AddWithValue(&quot;@id&quot;, this.id);                             cmd.ExecuteNonQuery();                             cmd.CommandText = &quot;DELETE FROM Authorization_RoleToControlGroup WHERE GroupID=@id&quot;;                             cmd.ExecuteNonQuery();                         }                         catch (Exception ex)                         {                             if (Configuration.s_log != null)                                 Configuration.s_log.Error(&quot;[\u041e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438] [\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0433\u0440\u0443\u043f\u043f\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f] &quot;, ex);                         }                     }                 }         }         \/\/\/ &lt;summary&gt;         \/\/\/ \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0430 \u0438\u0437 \u0433\u0440\u0443\u043f\u043f\u044b         \/\/\/ &lt;\/summary&gt;         \/\/\/ &lt;param name=&quot;controlID&quot;&gt;\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0430&lt;\/param&gt;         public void DeleteControl(int controlID)         {             using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[Configuration.ConnectionStringName].ConnectionString))             {                 using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(&quot;DELETE FROM Authorization_ControlToGroup WHERE ControlID=@control AND GroupID=@id&quot;, conn))                 {                     try                     {                         conn.Open();                         cmd.Parameters.AddWithValue(&quot;@control&quot;, controlID);                         cmd.Parameters.AddWithValue(&quot;@id&quot;, this.id);                         cmd.ExecuteNonQuery();                     }                     catch (Exception ex)                     {                         if (Configuration.s_log != null)                             Configuration.s_log.Error(&quot;[\u041e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438] [\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f] &quot;, ex);                     }                 }             }         }         \/\/\/ &lt;summary&gt;         \/\/\/ \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0440\u043e\u043b\u0438         \/\/\/ &lt;\/summary&gt;         \/\/\/ &lt;param name=&quot;roleID&quot;&gt;\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0440\u043e\u043b\u0438&lt;\/param&gt;         public void DeleteRole(int roleID)         {             using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[Configuration.ConnectionStringName].ConnectionString))             {                 using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(&quot;DELETE FROM Authorization_RoleToControlGroup WHERE RoleID=@role AND GroupID=@id&quot;, conn))                 {                     try                     {                         conn.Open();                         cmd.Parameters.AddWithValue(&quot;@id&quot;, this.id);                         cmd.Parameters.AddWithValue(&quot;@role&quot;, roleID);                         cmd.ExecuteNonQuery();                     }                     catch (Exception ex)                     {                         if (Configuration.s_log != null)                             Configuration.s_log.Error(&quot;[\u041e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438] [\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0440\u043e\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f] &quot;, ex);                     }                 }             }         }         #region InterfaceImplementation         bool IEquatable&lt;PageControlsGroup&gt;.Equals(PageControlsGroup other)         {             return this.id == other.id & this.Name == other.Name;         }         public bool Equals(PageControlsGroup x, PageControlsGroup y)         {             return x.id == y.id & x.Name == y.Name;         }         public int GetHashCode(PageControlsGroup obj)         {             return this.id.GetHashCode() + this.Name.GetHashCode() + this.Roles.GetHashCode();         }         #endregion     } }  <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043b\u0430\u0441\u0441 &#39;\u0421\u0432\u044f\u0437\u043a\u0430 \u0433\u0440\u0443\u043f\u043f\u044b \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043e\u0432 \u0438 \u0440\u043e\u043b\u0435\u0439&#39;<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">using System; using System.Collections.Generic; using System.Linq; using System.Text;  namespace Ekzo.Web.Security.Utilization.Authorization {     \/\/\/ &lt;summary&gt;     \/\/\/ \u041a\u043b\u0430\u0441\u0441 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0443 \u0440\u043e\u043b\u0435\u0439 \u043a \u0433\u0440\u0443\u043f\u043f\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043e\u0432     \/\/\/ &lt;\/summary&gt;     public class ControlsGroupRole     {         \/\/\/ &lt;summary&gt;         \/\/\/  \u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0440\u043e\u043b\u0438 \u043f\u043e \u0411\u0414 ConsUser         \/\/\/ &lt;\/summary&gt;         public int id { get; private set; }         \/\/\/ &lt;summary&gt;         \/\/\/ \u0418\u043c\u044f \u0440\u043e\u043b\u0438         \/\/\/ &lt;\/summary&gt;         public string Role         {             get             {                 string result = null;                 using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[Ekzo.Web.Configuration.StringName].ConnectionString))                 {                     using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(&quot;SELECT group_name FROM groups WHERE group_id=@id&quot;, conn))                     {                         try                         {                             conn.Open();                             cmd.Parameters.AddWithValue(&quot;@id&quot;, this.RoleID);                             System.Data.SqlClient.SqlDataReader reader = cmd.ExecuteReader();                             while (reader.Read())                                 result = reader.GetString(0);                         }                         catch (Exception ex)                         {                             if (Configuration.s_log != null)                                 Configuration.s_log.Error(&quot;[\u041e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438] [\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0433\u0440\u0443\u043f\u043f\u044b \u0434\u043b\u044f \u0440\u043e\u043b\u0438] &quot;, ex);                         }                     }                 }                 return result;             }         }         \/\/\/ &lt;summary&gt;         \/\/\/ \u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0440\u043e\u043b\u0438         \/\/\/ &lt;\/summary&gt;         public int RoleID { get; set; }         \/\/\/ &lt;summary&gt;         \/\/\/ \u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0433\u0440\u0443\u043f\u043f\u044b         \/\/\/ &lt;\/summary&gt;         public int GroupID { get; set; }          public ControlsGroupRole(int id, int groupID)         {             this.id = id;             this.GroupID = groupID;             InitClass(id, groupID);         }          private void InitClass(int id, int groupID)         {             this.RoleID = id;             this.GroupID = groupID;             using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[Configuration.ConnectionStringName].ConnectionString))             {                 using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(&quot;SELECT * FROM Authorization_RoleToControlGroup WHERE RoleID=@role AND GroupID=@group&quot;, conn))                 {                     try                     {                         conn.Open();                         cmd.Parameters.AddWithValue(&quot;@role&quot;, id);                         cmd.Parameters.AddWithValue(&quot;@group&quot;, groupID);                         System.Data.SqlClient.SqlDataReader reader = cmd.ExecuteReader();                         while (reader.Read())                             this.id = reader.GetInt32(0);                     }                     catch (Exception ex)                     {                         if (Configuration.s_log != null)                             Configuration.s_log.Error(&quot;[\u041e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438] [\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u0430 \u0440\u043e\u043b\u0438 \u0433\u0440\u0443\u043f\u043f\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f] &quot;, ex);                     }                 }             }         }         \/\/\/ &lt;summary&gt;         \/\/\/ \u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438 \u0440\u043e\u043b\u0438 \u043a \u0433\u0440\u0443\u043f\u043f\u0435         \/\/\/ &lt;\/summary&gt;         public void Save()         {             using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[Configuration.ConnectionStringName].ConnectionString))             {                 using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(@&quot;IF((SELECT COUNT(*) FROM Authorization_RoleToControlGroup WHERE RoleID=@id AND GroupID=@group)=0)                                                                                                          INSERT INTO Authorization_RoleToControlGroup(RoleID,GroupID) VALUES(@id,@group)&quot;, conn))                 {                     try                     {                         conn.Open();                         cmd.Parameters.AddWithValue(&quot;@id&quot;, this.id);                         cmd.Parameters.AddWithValue(&quot;@group&quot;, this.GroupID);                         cmd.ExecuteNonQuery();                     }                     catch (Exception ex)                     {                         if (Configuration.s_log != null)                             Configuration.s_log.Error(&quot;[\u041e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438] [\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0440\u043e\u043b\u0438 \u0433\u0440\u0443\u043f\u043f\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f] &quot;, ex);                     }                 }             }         }     } }  <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043b\u0430\u0441\u0441 &#39;\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u0430\u044f \u0440\u043e\u043b\u044c&#39;<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Web;  namespace Ekzo.Web.Security.Utilization.Authorization {     \/\/\/ &lt;summary&gt;     \/\/\/ \u041e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0440\u043e\u043b\u0438 \u0438\u0437 \u0411\u0414 ConsUser     \/\/\/ &lt;\/summary&gt;     public class SystemRole     {         \/\/\/ &lt;summary&gt;         \/\/\/ \u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0440\u043e\u043b\u0438 \u0438\u0437 \u0431\u0430\u0437\u044b \u0440\u0430\u0437\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u0430\u0432         \/\/\/ &lt;\/summary&gt;         public int id { get; private set; }         \/\/\/ &lt;summary&gt;         \/\/\/ \u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0440\u043e\u043b\u0438 \u0438\u0437 \u0411\u0414 ConsUser         \/\/\/ &lt;\/summary&gt;         public int baseID { get; private set; }         \/\/\/ &lt;summary&gt;         \/\/\/ \u0418\u043c\u044f \u0440\u043e\u043b\u0438         \/\/\/ &lt;\/summary&gt;         public string Role { get; private set; }         public int ActionGroup { get; private set; }          public SystemRole() { }          public SystemRole(string role)         {             InitClass(role);         }          public SystemRole(int actionGorup, string role)         {             InitClass(role, actionGorup);         }          public SystemRole(int baseID, int actionGroup = 0)         {              using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[Ekzo.Web.Configuration.StringName].ConnectionString))             {                 using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(&quot;SELECT group_name FROM groups WHERE group_id=@id&quot;, conn))                 {                     try                     {                         conn.Open();                         cmd.Parameters.AddWithValue(&quot;@id&quot;, baseID);                         System.Data.SqlClient.SqlDataReader reader = cmd.ExecuteReader();                         while (reader.Read())                             this.Role = reader.GetString(0);                         this.baseID = baseID;                         this.ActionGroup = actionGroup;                     }                     catch (Exception ex)                     {                         if (Configuration.s_log != null)                             Configuration.s_log.Error(&quot;[\u041e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438] [\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0440\u043e\u043b\u0438 \u0438\u0437 \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a\u0430] &quot;, ex);                     }                 }             }         }          private void InitClass(string role, int actionGroup = -1)         {             this.ActionGroup = actionGroup;             this.Role = role;             using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[Configuration.ConnectionStringName].ConnectionString))             {                 using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(&quot;SELECT * FROM Authorization_RoleToActionGroup WHERE ActionGroup=@groupID AND Role=@role&quot;, conn))                 {                     try                     {                         if (actionGroup == -1) cmd.CommandText = &quot;SELECT * FROM Authorization_RoleToActionGroup WHERE Role=@role&quot;;                         conn.Open();                         cmd.Parameters.AddWithValue(&quot;@groupID&quot;, actionGroup);                         cmd.Parameters.AddWithValue(&quot;@role&quot;, role);                         System.Data.SqlClient.SqlDataReader reader = cmd.ExecuteReader();                         while (reader.Read())                         {                             this.id = reader.GetInt32(0);                             this.Role = reader.GetString(2);                             this.ActionGroup = reader.GetInt32(1);                         }                     }                     catch (Exception ex)                     {                         if (Configuration.s_log != null)                             Configuration.s_log.Error(&quot;[\u041e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438] [\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0440\u043e\u043b\u0438] &quot;, ex);                     }                 }             }              using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[Ekzo.Web.Configuration.StringName].ConnectionString))             {                 using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(&quot;SELECT group_id FROM groups WHERE group_name=@name&quot;, conn))                 {                     try                     {                         conn.Open();                         cmd.Parameters.AddWithValue(&quot;@name&quot;, this.Role);                         System.Data.SqlClient.SqlDataReader reader = cmd.ExecuteReader();                         while (reader.Read())                             this.baseID = reader.GetInt32(0);                     }                     catch (Exception ex)                     {                         if (Configuration.s_log != null)                             Configuration.s_log.Error(&quot;[\u041e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438] [\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0440\u043e\u043b\u0438. \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0440\u043e\u043b\u0438 \u0438\u0437 \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a\u0430] &quot;, ex);                     }                 }             }         }         \/\/\/ &lt;summary&gt;         \/\/\/ \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0439 \u0440\u043e\u043b\u0438         \/\/\/ &lt;\/summary&gt;         \/\/\/ &lt;param name=&quot;Name&quot;&gt;\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0440\u043e\u043b\u0438&lt;\/param&gt;         \/\/\/ &lt;returns&gt;&lt;\/returns&gt;         public static SystemRole CreateRole(string Name)         {             SystemRole role = new SystemRole();             role.Role = Name;              using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[Ekzo.Web.Configuration.StringName].ConnectionString))             {                 using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(&quot;INSERT INTO groups(group_id,group_name) SELECT MIN(group_id)-1,@name FROM groups WHERE group_id&gt;-1000&quot;, conn))                 {                     try                     {                         conn.Open();                         cmd.Parameters.AddWithValue(&quot;@name&quot;, Name);                         cmd.ExecuteNonQuery();                         cmd.CommandText = &quot;SELECT group_id FROM groups WHERE group_name=@name&quot;;                         System.Data.SqlClient.SqlDataReader reader = cmd.ExecuteReader();                         while (reader.Read())                             role.baseID = reader.GetInt32(0);                     }                     catch (Exception ex)                     {                         if (Configuration.s_log != null)                             Configuration.s_log.Error(&quot;[\u041e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438] [\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u043e\u043b\u0438 \u0432 \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a] &quot;, ex);                     }                 }             }              using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[Configuration.ConnectionStringName].ConnectionString))             {                 using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(&quot;INSERT INTO Authorization_RoleToActionGroup(ActionGroup,Role) VALUES(@group,@name)&quot;, conn))                 {                     try                     {                         conn.Open();                         cmd.Parameters.AddWithValue(&quot;@name&quot;, role.Role);                         cmd.Parameters.AddWithValue(&quot;@group&quot;, -1);                         cmd.ExecuteNonQuery();                     }                     catch (Exception ex)                     {                         if (Configuration.s_log != null)                             Configuration.s_log.Error(&quot;[\u041e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438] [\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u043e\u043b\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438] &quot;, ex);                     }                 }             }             role.ActionGroup = -1;             return role;         }         \/\/\/ &lt;summary&gt;         \/\/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u043e\u043b\u0435\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f         \/\/\/ &lt;\/summary&gt;         \/\/\/ &lt;param name=&quot;employeeID&quot;&gt;\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430&lt;\/param&gt;         \/\/\/ &lt;returns&gt;&lt;\/returns&gt;         public static string[] GetEmployeeRoles(int employeeID)         {             List&lt;string&gt; roles = new List&lt;string&gt;();              using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[Configuration.StringName].ConnectionString))             {                 using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(&quot;SELECT group_name FROM employee2group INNER JOIN groups ON intranet_employee2group.group_id = groups.group_id WHERE employee_id=@employeeID ORDER BY group_name&quot;, conn))                 {                     try                     {                         conn.Open();                         cmd.Parameters.AddWithValue(&quot;@employeeID&quot;, employeeID);                         System.Data.SqlClient.SqlDataReader reader = cmd.ExecuteReader();                         while (reader.Read())                             roles.Add(reader.GetString(0));                     }                     catch (Exception ex)                     {                         if (Configuration.s_log != null)                             Configuration.s_log.Error(&quot;[\u041e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438] [\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0440\u043e\u043b\u0435\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435] &quot;, ex);                     }                 }             }             List&lt;string&gt; roleToDelete = new List&lt;string&gt;();             foreach (string role in roles)                 if (!HttpContext.Current.User.IsInRole(role)) roleToDelete.Add(role);             for (int i = 0; i &lt; roleToDelete.Count; i++)                 roles.Remove(roleToDelete[i]);               return roles.ToArray();         }         \/\/\/ &lt;summary&gt;         \/\/\/ \u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0440\u043e\u043b\u0438         \/\/\/ &lt;\/summary&gt;         public void Save()         {             using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[Configuration.ConnectionStringName].ConnectionString))             {                 using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(@&quot;                         IF((SELECT COUNT(*) FROM Authorization_RoleToActionGroup WHERE id=@id OR Role=@name AND ActionGroup=@groupID)=0)                              INSERT INTO Authorization_RoleToActionGroup(ActionGroup,Role) VALUES(@groupID, @name)                          ELSE                              UPDATE Authorization_RoleToActionGroup SET ActionGroup=@groupID, Role=@name WHERE id=@id&quot;, conn))                 {                     try                     {                         conn.Open();                         cmd.Parameters.AddWithValue(&quot;@id&quot;, this.id);                         cmd.Parameters.AddWithValue(&quot;@name&quot;, this.Role);                         cmd.Parameters.AddWithValue(&quot;@groupID&quot;, this.ActionGroup);                         cmd.ExecuteNonQuery();                         cmd.CommandText = &quot;SELECT * FROM Authorization_RoleToActionGroup WHERE Role=@name AND ActionGroup=@groupID&quot;;                         System.Data.SqlClient.SqlDataReader reader = cmd.ExecuteReader();                         while (reader.Read())                         {                             this.id = reader.GetInt32(0);                             this.ActionGroup = reader.GetInt32(1);                             this.Role = reader.GetString(2);                         }                     }                     catch (Exception ex)                     {                         if (Configuration.s_log != null)                             Configuration.s_log.Error(&quot;[\u041e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438] [\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0440\u043e\u043b\u0438 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438] &quot;, ex);                     }                 }             }         }         \/\/\/ &lt;summary&gt;         \/\/\/ \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0440\u043e\u043b\u0438         \/\/\/ &lt;\/summary&gt;         \/\/\/ &lt;remarks&gt;\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a\u0430\u043a \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0431\u0430\u0437\u044b \u0440\u0430\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u0430\u0432, \u0442\u0430\u043a \u0438 \u0438\u0437 ConsUser&lt;\/remarks&gt;         public void Delete()         {             using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[Configuration.ConnectionStringName].ConnectionString))             {                 using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(&quot;DELETE FROM Authorization_RoleToActionGroup WHERE id=@id&quot;, conn))                 {                     try                     {                         conn.Open();                         cmd.Parameters.AddWithValue(&quot;@id&quot;, this.id);                         cmd.ExecuteNonQuery();                         cmd.CommandText = &quot;DELETE FROM Authorization_RoleToActionGroup WHERE ActionGroup=@id&quot;;                         cmd.ExecuteNonQuery();                     }                     catch (Exception ex)                     {                         if (Configuration.s_log != null)                             Configuration.s_log.Error(&quot;[\u041e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438] [\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0440\u043e\u043b\u0438 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438] &quot;, ex);                     }                 }             }              using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[Ekzo.Web.Configuration.StringName].ConnectionString))             {                 using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(&quot;DELETE FROM employee2group WHERE group_id=@groupID&quot;, conn))                 {                     try                     {                         conn.Open();                         cmd.Parameters.AddWithValue(&quot;@groupID&quot;, this.baseID);                         cmd.ExecuteNonQuery();                         cmd.Parameters.AddWithValue(&quot;@name&quot;, this.Role);                         cmd.CommandText = &quot;DELETE FROM groups WHERE group_name=@name&quot;;                         cmd.ExecuteNonQuery();                     }                     catch (Exception ex)                     {                         if (Configuration.s_log != null)                             Configuration.s_log.Error(&quot;[\u041e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438] [\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043a \u0440\u043e\u043b\u0438 \u0432 \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a\u0435] &quot;, ex);                     }                 }             }         }         #region StaticFields         \/\/\/ &lt;summary&gt;         \/\/\/ \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u0441\u0435\u0445 \u0440\u043e\u043b\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438         \/\/\/ &lt;\/summary&gt;         \/\/\/ &lt;returns&gt;&lt;\/returns&gt;         public static List&lt;string&gt; GetAllRoles()         {             List&lt;string&gt; result = new List&lt;string&gt;();              using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[Configuration.ConnectionStringName].ConnectionString))             {                 using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(&quot;SELECT DISTINCT Role FROM Authorization_RoleToActionGroup ORDER BY Role&quot;, conn))                 {                     try                     {                         conn.Open();                         System.Data.SqlClient.SqlDataReader reader = cmd.ExecuteReader();                         while (reader.Read())                             result.Add(reader.GetString(0));                     }                     catch (Exception ex)                     {                         if (Configuration.s_log != null)                             Configuration.s_log.Error(&quot;[\u041e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438] [\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0440\u043e\u043b\u0435\u0439 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438] &quot;, ex);                     }                 }             }             return result;         }         \/\/\/ &lt;summary&gt;         \/\/\/ \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u0441\u0435\u0445 \u043f\u043e\u043b\u0435\u0439 \u0438\u043d\u0442\u0440\u0430\u043d\u0435\u0442\u0430         \/\/\/ &lt;\/summary&gt;         \/\/\/ &lt;returns&gt;&lt;\/returns&gt;         public static List&lt;string&gt; GetAllIntranetRoles()         {             List&lt;string&gt; result = new List&lt;string&gt;();              using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[Ekzo.Web.Configuration.StringName].ConnectionString))             {                 using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(&quot;SELECT DISTINCT group_name FROM groups ORDER BY group_name&quot;, conn))                 {                     try                     {                         conn.Open();                         System.Data.SqlClient.SqlDataReader reader = cmd.ExecuteReader();                         while (reader.Read())                             result.Add(reader.GetString(0));                     }                     catch (Exception ex)                     {                         if (Configuration.s_log != null)                             Configuration.s_log.Error(&quot;[\u041e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438] [\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0440\u043e\u043b\u0435\u0439 \u0438\u0437 \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a\u0430] &quot;, ex);                     }                 }             }             return result;         }         \/\/\/ &lt;summary&gt;         \/\/\/ \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0434\u043b\u044f \u0440\u043e\u043b\u0438         \/\/\/ &lt;\/summary&gt;         \/\/\/ &lt;param name=&quot;role&quot;&gt;\u0418\u043c\u044f \u0440\u043e\u043b\u0438&lt;\/param&gt;         \/\/\/ &lt;returns&gt;&lt;\/returns&gt;         public static List&lt;BaseClasses.Employee&gt; EmployeesInRole(string role)         {             List&lt;BaseClasses.Employee&gt; result = new List&lt;BaseClasses.Employee&gt;();              using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[Ekzo.Web.Configuration.StringName].ConnectionString))             {                 using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(&quot;SELECT intranet_employee2group.employee_id FROM groups INNER JOIN intranet_employee2group on groups.group_id=intranet_employee2group.group_id WHERE group_name=@groupName&quot;, conn))                 {                     try                     {                         conn.Open();                         cmd.Parameters.AddWithValue(&quot;@groupName&quot;, role);                         System.Data.SqlClient.SqlDataReader reader = cmd.ExecuteReader();                         while (reader.Read())                             result.Add(new BaseClasses.Employee(reader.GetInt32(0)));                     }                     catch (Exception ex)                     {                         if (Configuration.s_log != null)                             Configuration.s_log.Error(&quot;[\u041e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438] [\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u0438\u043c\u0435\u044e\u0449\u0438\u0445 \u0440\u043e\u043b\u044c] &quot;, ex);                     }                 }             }             return result;         }         \/\/\/ &lt;summary&gt;         \/\/\/ \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0440\u043e\u043b\u0435\u0439 \u0434\u043b\u044f \u0433\u0440\u0443\u043f\u043f\u044b         \/\/\/ &lt;\/summary&gt;         \/\/\/ &lt;param name=&quot;GroupName&quot;&gt;\u0418\u043c\u044f \u0433\u0440\u0443\u043f\u043f\u044b&lt;\/param&gt;         \/\/\/ &lt;returns&gt;&lt;\/returns&gt;         public static SystemRole[] GetGroupRoles(string GroupName)         {             ActionGroup group = new ActionGroup(GroupName);             return GetGroupRoles(group.id);         }         \/\/\/ &lt;summary&gt;         \/\/\/ \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0440\u043e\u043b\u0435\u0439 \u0434\u043b\u044f \u0433\u0440\u0443\u043f\u043f\u044b         \/\/\/ &lt;\/summary&gt;         \/\/\/ &lt;param name=&quot;groupID&quot;&gt;\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0433\u0440\u0443\u043f\u043f\u044b \u043f\u043e \u0411\u0414 \u0440\u0430\u0437\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u0430\u0432\u0434 \u0434\u043e\u0441\u0442\u0443\u043f\u0430&lt;\/param&gt;         \/\/\/ &lt;returns&gt;&lt;\/returns&gt;         public static SystemRole[] GetGroupRoles(int groupID)         {             List&lt;SystemRole&gt; rolesList = new List&lt;SystemRole&gt;();             using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[Configuration.ConnectionStringName].ConnectionString))             {                 using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(&quot;SELECT * FROM Authorization_RoleToActionGroup WHERE ActionGroup=@groupID&quot;, conn))                 {                     try                     {                         conn.Open();                         cmd.Parameters.AddWithValue(&quot;@groupID&quot;, groupID);                         System.Data.SqlClient.SqlDataReader reader = cmd.ExecuteReader();                         while (reader.Read())                             rolesList.Add(new SystemRole(reader.GetInt32(1), reader.GetString(2)));                     }                     catch (Exception ex)                     {                         if (Configuration.s_log != null)                             Configuration.s_log.Error(&quot;[\u041e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438] [\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0440\u043e\u043b\u0435\u0439 \u0433\u0440\u0443\u043f\u043f\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439] &quot;, ex);                     }                 }             }             return rolesList.ToArray();         }         public static int? IntranetRoleID(string roleName)         {             int? result = null;             using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[Configuration.StringName].ConnectionString))             {                 using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(&quot;SELECT group_id FROM groups WHERE group_name=@name&quot;, conn))                 {                     try                     {                         conn.Open();                         cmd.Parameters.AddWithValue(&quot;@name&quot;, roleName);                         using (System.Data.SqlClient.SqlDataReader reader = cmd.ExecuteReader())                             while (reader.Read())                                 result = reader.GetInt32(0);                     }                     catch (Exception ex)                     {                         Configuration.s_log.Error(&quot;[\u041e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438] [\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u0440\u043e\u043b\u0438]&quot;, ex);                     }                 }             }             return result;         }         #endregion     } } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430, \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u043e\u0433\u043e \u043e\u0442 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 (AuthorizeAttribute), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u043a \u043c\u0435\u0442\u043e\u0434\u0430\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432 \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c, \u0438\u043c\u0435\u0435\u0442 \u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u0440\u0430\u0432\u043e \u043d\u0430 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u0441\u0430\u0439\u0442\u0430 (<i>\u0442\u0443\u0442 \u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u043a\u0430 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u0430\u044f, \u043d\u043e \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043f\u0443\u0441\u0442\u044c \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u043e\u0439<\/i>).<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0430\u0442\u0440\u0438\u0431\u0443\u0442<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc;  namespace Ekzo.Web.Security.Utilization {     \/\/\/ &lt;summary&gt;     \/\/\/ \u0410\u0442\u0440\u0438\u0431\u0443\u0442 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0449\u0438\u0439 \u0440\u0430\u0437\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0430\u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043c\u0435\u0442\u043e\u0434\u0430\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432     \/\/\/ &lt;\/summary&gt;     [AttributeUsage(AttributeTargets.All, AllowMultiple = false, Inherited = false)]     public class ActionAuthorization : AuthorizeAttribute     {         \/\/\/ &lt;summary&gt;         \/\/\/ \u0418\u043c\u044f \u043c\u0435\u0442\u043e\u0434\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430         \/\/\/ &lt;\/summary&gt;         public string ActionName { get; set; }         \/\/\/ &lt;summary&gt;         \/\/\/ \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043d\u0430 \u043f\u0440\u0430\u0432\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043c\u0435\u0442\u043e\u0434\u0443         \/\/\/ &lt;\/summary&gt;         \/\/\/ &lt;param name=&quot;httpContext&quot;&gt;\u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442&lt;\/param&gt;         \/\/\/ &lt;returns&gt;\u0415\u0441\u043b\u0438 \u043f\u0440\u0430\u0432\u043e \u0435\u0441\u0442\u044c, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434. \u0418\u043d\u0430\u0447\u0435 \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043e\u0448\u0438\u0431\u043a\u0438.&lt;\/returns&gt;         protected override bool AuthorizeCore(HttpContextBase httpContext)         {             bool result = false;             var isAuthorized = base.AuthorizeCore(httpContext);             if (!isAuthorized) return false;             Authorization.Action currentAction = new Authorization.Action(this.ActionName);              \/\/\u0415\u0441\u043b\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043d\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e \u0432 \u0411\u0414, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c.             if (!currentAction.IsExist()) currentAction.Save();              \/\/\u0415\u0441\u043b\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0434\u0435\u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043e, \u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0432\u0441\u0435\u0445.             if (!currentAction.Active) return true;              string[] currentUserRoles = AuthLib.Helpers.RoleProviderHelper.GetUserGroups(httpContext.User.Identity.Name);             foreach (string role in currentUserRoles)             {                 if (currentAction.ActionGroups != null && currentAction.ActionGroups.Where(o =&gt; o.Roles.Select(n =&gt; n.Role).Contains(role)).Count() != 0) { result = true; break; }             }                          return result;         }     } } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0412 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e \u043d\u0435\u0442. \u041c\u044b \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e AuthorizeCore, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0438\u0442 true \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0438\u043c\u0435\u0435\u0442 \u043f\u0440\u0430\u0432\u043e \u043d\u0430 \u0434\u043e\u0441\u0442\u0443\u043f \u0438\u043b\u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u043b \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445. \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u043f\u0440\u0430\u0432\u0430 \u043d\u0430 \u0434\u043e\u0441\u0442\u0443\u043f, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f false \u0438 \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043e\u0448\u0438\u0431\u043a\u0438 401.<br \/>  \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u043e\u0447\u0443 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u0435:<\/p>\n<pre><code class=\"cs\">if (!currentAction.IsExist()) currentAction.Save(); <\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430. \u0415\u0441\u043b\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u043d\u0435\u0442, \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0435\u0433\u043e. \u0421\u0434\u0435\u043b\u0430\u043d\u043e \u044d\u0442\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u0430\u0432\u0438\u043b \u0434\u043b\u044f \u043d\u043e\u0432\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u0445 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 (\u0437\u0430\u0431\u0435\u0433\u0430\u044f \u0432\u043f\u0435\u0440\u0435\u0434 \u0441\u043a\u0430\u0436\u0443, \u0447\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u044e\u0449\u0435\u0433\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0434\u043b\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u0432, \u0442\u0430\u043a \u0447\u0442\u043e \u0434\u043e\u0441\u0442\u0443\u043f \u043f\u043e\u043b\u0443\u0447\u0430\u0442 \u0432\u0441\u0435, \u043a\u0442\u043e \u0438\u043c\u0435\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043f\u0440\u0430\u0432\u0430).<\/p>\n<p>  \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u0445 (\u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e).<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">using System; using System.Linq; using System.Web; using System.Web.Mvc;  namespace Ekzo.Web.Security {     \/\/\/ &lt;summary&gt;     \/\/\/ \u0410\u0442\u0442\u0440\u0438\u0431\u0443\u0442 \u0440\u0430\u0437\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0443     \/\/\/ &lt;\/summary&gt;     public class ControlAccesSecurity     {         \/\/\/ &lt;summary&gt;         \/\/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u0440\u0430\u0432\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430 \u043a \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0443         \/\/\/ &lt;\/summary&gt;         \/\/\/ &lt;param name=&quot;controlName&quot;&gt;\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0430, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0435\u0435 \u0435\u0433\u043e&lt;\/param&gt;         \/\/\/ &lt;returns&gt;\u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0438\u043c\u0435\u0435\u0442 \u043f\u0440\u0430\u0432\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 - \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 true, \u0438\u043d\u0430\u0447\u0435 false&lt;\/returns&gt;         public static bool HasControlAccess(string controlName)         {             BaseClasses.Employee employee = new BaseClasses.Employee(AuthLib.Helpers.RoleProviderHelper.GetUserId(HttpContext.Current));             Utilization.Authorization.PageControl currentControl = new Utilization.Authorization.PageControl(controlName);             foreach (Utilization.Authorization.PageControlsGroup group in currentControl.Groups)                 if (group.Roles.Where(o =&gt; Utilization.Authorization.SystemRole.GetEmployeeRoles(employee.Id).Contains(o.Role)).Count() != 0)                     return true;              return false;         }     } }  namespace Ekzo.Web.Security.SecurityExtensions {     \/\/\/ &lt;summary&gt;     \/\/\/ \u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0449\u0438\u0435 \u0440\u0430\u0437\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0430\u0432\u0434 \u0434\u043e\u0441\u0442\u0443\u043f\u0430     \/\/\/ &lt;\/summary&gt;     public static class StringExtensions     {         \/\/\/ &lt;summary&gt;         \/\/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u0440\u0430\u0432\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430 \u043a \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0443         \/\/\/ &lt;\/summary&gt;         \/\/\/ &lt;param name=&quot;controlName&quot;&gt;\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0430, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0435\u0435 \u0435\u0433\u043e&lt;\/param&gt;         \/\/\/ &lt;returns&gt;\u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0438\u043c\u0435\u0435\u0442 \u043f\u0440\u0430\u0432\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 - \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0440\u043e, \u0438\u043d\u0430\u0447\u0435 \u043f\u0443\u0441\u0442\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443&lt;\/returns&gt;         public static MvcHtmlString HasControlAccess(this MvcHtmlString s, string controlName)         {             BaseClasses.Employee employee = new BaseClasses.Employee(AuthLib.Helpers.RoleProviderHelper.GetUserId(HttpContext.Current));             Utilization.Authorization.PageControl currentControl = new Utilization.Authorization.PageControl(controlName);             foreach (Utilization.Authorization.PageControlsGroup group in currentControl.Groups)                 if (group.Roles.Where(o =&gt; Utilization.Authorization.SystemRole.GetEmployeeRoles(employee.Id).Contains(o.Role)).Count() != 0)                     return s;              return MvcHtmlString.Create(&quot;&quot;);         }          \/\/\/ &lt;summary&gt;         \/\/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u0440\u0430\u0432\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430 \u043a \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0443         \/\/\/ &lt;\/summary&gt;         \/\/\/ &lt;param name=&quot;controlName&quot;&gt;\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0430, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0435\u0435 \u0435\u0433\u043e&lt;\/param&gt;         \/\/\/ &lt;returns&gt;\u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0438\u043c\u0435\u0435\u0442 \u043f\u0440\u0430\u0432\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 - \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0440\u043e, \u0438\u043d\u0430\u0447\u0435 \u043f\u0443\u0441\u0442\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443&lt;\/returns&gt;         public static IHtmlString HasControlAccess(this IHtmlString s, string controlName)         {             BaseClasses.Employee employee = new BaseClasses.Employee(AuthLib.Helpers.RoleProviderHelper.GetUserId(HttpContext.Current));             Utilization.Authorization.PageControl currentControl = new Utilization.Authorization.PageControl(controlName);             foreach (Utilization.Authorization.PageControlsGroup group in currentControl.Groups)                 if (group.Roles.Where(o =&gt; Utilization.Authorization.SystemRole.GetEmployeeRoles(employee.Id).Contains(o.Role)).Count() != 0)                     return s;              return MvcHtmlString.Create(string.Empty);         }          \/\/\/ &lt;summary&gt;         \/\/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u0440\u0430\u0432\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430 \u043a \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0443         \/\/\/ &lt;\/summary&gt;         \/\/\/ &lt;param name=&quot;controlName&quot;&gt;\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0430, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0435\u0435 \u0435\u0433\u043e&lt;\/param&gt;         \/\/\/ &lt;returns&gt;\u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0438\u043c\u0435\u0435\u0442 \u043f\u0440\u0430\u0432\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 - \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0440\u043e, \u0438\u043d\u0430\u0447\u0435 \u043f\u0443\u0441\u0442\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443&lt;\/returns&gt;         public static string HasControlAccess(this string s, string controlName)         {             BaseClasses.Employee employee = new BaseClasses.Employee(AuthLib.Helpers.RoleProviderHelper.GetUserId(HttpContext.Current));             Utilization.Authorization.PageControl currentControl = new Utilization.Authorization.PageControl(controlName);             foreach (Utilization.Authorization.PageControlsGroup group in currentControl.Groups)                 if (group.Roles.Where(o =&gt; Utilization.Authorization.SystemRole.GetEmployeeRoles(employee.Id).Contains(o.Role)).Count() != 0)                     return s;              return String.Empty;         }      }     \/\/\/ &lt;summary&gt;     \/\/\/ \u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0434\u043b\u044f TagBuilder'a \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0449\u0438\u0435 \u0440\u0430\u0437\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0430\u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u0430     \/\/\/ &lt;\/summary&gt;     public static class TagBuilderExtensions     {         \/\/\/ &lt;summary&gt;         \/\/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u0440\u0430\u0432\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430 \u043a \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0443         \/\/\/ &lt;\/summary&gt;         \/\/\/ &lt;param name=&quot;controlName&quot;&gt;\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0430, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0435\u0435 \u0435\u0433\u043e&lt;\/param&gt;         \/\/\/ &lt;returns&gt;\u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0438\u043c\u0435\u0435\u0442 \u043f\u0440\u0430\u0432\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 - \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0440\u043e, \u0438\u043d\u0430\u0447\u0435 \u043f\u0443\u0441\u0442\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443&lt;\/returns&gt;         public static  TagBuilder HasControlAccess(this TagBuilder s, string controlName)         {             BaseClasses.Employee employee = new BaseClasses.Employee(AuthLib.Helpers.RoleProviderHelper.GetUserId(HttpContext.Current));             Utilization.Authorization.PageControl currentControl = new Utilization.Authorization.PageControl(controlName);             foreach (Utilization.Authorization.PageControlsGroup group in currentControl.Groups)                 if (group.Roles.Where(o =&gt; Utilization.Authorization.SystemRole.GetEmployeeRoles(employee.Id).Contains(o.Role)).Count() != 0)                     return s;              return new TagBuilder(&quot;b&quot;);         }     } } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u042d\u0442\u043e \u0432\u0441\u0435, \u0447\u0442\u043e \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0430\u0432.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0435<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">[ActionAuthorization(ActionName = &quot;\u0417\u0430\u043f\u0440\u043e\u0441\u044b \u0432 \u0440\u0430\u0431\u043e\u0442\u0435&quot;)]         public ActionResult RequestsInWork()         {             ViewBag.Title = &quot;\u0417\u0430\u043f\u0440\u043e\u0441\u044b \u0432 \u0440\u0430\u0431\u043e\u0442\u0435&quot;;             return View();         } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">...       @Html.MainMenu().HasControlAccess(&quot;\u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u043c\u0435\u043d\u044e&quot;) ... <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<h5>\u041f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u0435<\/h5>\n<p>  \u0417\u0434\u0435\u0441\u044c \u044f \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u044c \u0441\u043c\u044b\u0441\u043b \u0432\u0441\u0435\u0433\u043e \u0431\u0435\u0437\u043e\u0431\u0440\u0430\u0437\u0438\u044f, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u043d\u0435\u0435.<br \/>  \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432, \u043d\u043e \u0438 \u00ab\u043b\u044e\u0431\u044b\u043c\u0438\u00bb \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u0445 \u0441\u0430\u0439\u0442\u043e\u0432.<br \/>  \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u0430 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043c\u043e\u0434\u0443\u043b\u044f, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0430\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0441\u0432\u044f\u0437\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c-\u0440\u043e\u043b\u044c-\u00ab\u0433\u0440\u0443\u043f\u043f\u044b \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432\u00bb-\u00ab\u0437\u0430\u0449\u0438\u0449\u0430\u0435\u043c\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u00bb \u0432 \u043b\u044e\u0431\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438. \u0422\u043e \u0435\u0441\u0442\u044c \u041b\u044e\u0431\u043e\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432 \u043b\u044e\u0431\u043e\u0439 \u0440\u043e\u043b\u0438. \u0420\u043e\u043b\u044c \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u0430 \u043a \u043b\u044e\u0431\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u0435 \u0437\u0430\u0449\u0438\u0449\u0430\u0435\u043c\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u041e\u0431\u044a\u0435\u043a\u0442 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c\u0441\u044f \u0432 \u043b\u044e\u0431\u043e\u0439 \u0440\u043e\u043b\u0438. <br \/>  \u0422\u0430\u043a\u0430\u044f \u0432\u0438\u0442\u0438\u0435\u0432\u0430\u0442\u0430\u044f \u0441\u0432\u044f\u0437\u043a\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0435 \u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0435 \u0437\u0430\u0449\u0438\u0449\u0430\u0435\u043c\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438 \u0440\u043e\u043b\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043e\u043d\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0438 \u043d\u043e\u0432\u043e\u0439 \u0440\u043e\u043b\u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043a\u0430\u043a \u0432\u044b\u0434\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0430 \u0443\u0436\u0435 \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u043d\u044b\u0435 \u0434\u0440\u0443\u0433\u043e\u0439 \u0440\u043e\u043b\u0438 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435, \u0442\u0430\u043a \u0438 \u0432\u044b\u0434\u0430\u0442\u044c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u043f\u0440\u0430\u0432. \u0415\u0441\u043b\u0438 \u043f\u0440\u0438\u0434\u0435\u0442 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a \u0438 \u0441\u043a\u0430\u0436\u0435\u0442 \u00ab\u0445\u043e\u0447\u0443 \u043d\u043e\u0432\u0443\u044e \u0440\u043e\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u0442\u043e-\u0442\u043e \u0438 \u0442\u043e-\u0442\u043e\u00bb \u0432\u0441\u0435 \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044e \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439, \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0438\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u043a\u043e\u0434\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<br \/>  \u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043c\u043e\u0434\u0443\u043b\u0435, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0442\u0430\u043a\u0436\u0435 \u0433\u0438\u0431\u043a\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0432\u044b\u0432\u043e\u0434\u0438\u043c\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u0430\u0445 HtmlHelper&#8217;\u0430.<\/p>\n<p>  \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0430\u0432 \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438 \u0441 AJAX \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438. <\/p>\n<h6>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u043a\u0443\u0441\u043d\u044f\u0448\u043a\u0438<\/h6>\n<p>  \u0414\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043a\u043b\u0430\u0441\u0441-\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0442\u043e\u0440<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0442\u043e\u0440<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">using System; using System.Collections.Generic; using System.Data.SqlClient; using log4net;  namespace Ekzo.Web {     public static class Configuration     {         \/\/\/ &lt;summary&gt;         \/\/\/ \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0411\u0414 \u0432 \u0444\u0430\u0439\u043b\u0435 web.config, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u043d\u0430 \u0431\u0430\u0437\u0443 \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c\u0438 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438.         \/\/\/ \u041f\u043e\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e DataSource         \/\/\/ &lt;\/summary&gt;         public static string ConnectionStringName = &quot;DataSource&quot;;         \/\/\/ &lt;summary&gt;         \/\/\/ \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0411\u0414 \u0432 \u0444\u0430\u0439\u043b\u0435 web.config, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u043d\u0430 \u0431\u0430\u0437\u0443         \/\/\/ \u041f\u043e\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e         \/\/\/ &lt;\/summary&gt;         public static string StringName = &quot;ConsUser&quot;;         \/\/\/ &lt;summary&gt;         \/\/\/ \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430         \/\/\/ &lt;\/summary&gt;         public static string ProjectName = &quot;Project Name&quot;;          \/\/\/ &lt;summary&gt;         \/\/\/ \u041e\u0431\u044a\u0435\u043a\u0442 \u043b\u043e\u0433\u0430 log4net         \/\/\/ &lt;\/summary&gt;         public static ILog s_log = null;          \/\/\/ &lt;summary&gt;         \/\/\/ \u0421\u043f\u0438\u0441\u043e\u043a \u0442\u0430\u0431\u043b\u0438\u0446 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438         \/\/\/ &lt;\/summary&gt;         private static string[] tables = { &quot;Authorization_ActionGroups&quot;,                                             &quot;Authorization_Actions&quot;,                                            &quot;Authorization_ActionToGroup&quot;,                                            &quot;Authorization_Controls&quot;,                                            &quot;Authorization_ControlsGroup&quot;,                                            &quot;Authorization_ControlToGroup&quot;,                                            &quot;Authorization_RoleToActionGroup&quot;,                                            &quot;Authorization_RoleToControlGroup&quot;};          \/\/\/ &lt;summary&gt;         \/\/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0442\u0430\u0431\u043b\u0438\u0446 \u0432 \u0411\u0414         \/\/\/ &lt;\/summary&gt;         \/\/\/ &lt;returns&gt;\u0415\u0441\u043b\u0438 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u043d\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430 \u0432 \u0411\u0414, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043b\u043e\u0436\u043d\u044b\u043c&lt;\/returns&gt;         public static bool BaseHasTables()         {             List&lt;string&gt; dbTables = new List&lt;string&gt;();             using (SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[ConnectionStringName].ConnectionString))             {                 using (SqlCommand cmd = new SqlCommand(&quot;select TABLE_NAME from information_schema.tables WHERE TABLE_NAME LIKE 'Authorization_%'&quot;, conn))                 {                     try                     {                         conn.Open();                         using (SqlDataReader reader = cmd.ExecuteReader())                         {                             while (reader.Read())                                 dbTables.Add(reader.GetString(0));                         }                         foreach (string securityTable in tables)                             if (dbTables.Contains(securityTable))                                 dbTables.Remove(securityTable);                     }                     catch (Exception ex)                     {                         Configuration.s_log.Error(&quot;[\u041e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438] [\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u0430\u0431\u043b\u0438\u0446 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438] &quot;, ex);                     }                 }             }             if (dbTables.Count == 0) return false; else return true;         }         \/\/\/ &lt;summary&gt;         \/\/\/ \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0432 \u0411\u0414         \/\/\/ &lt;\/summary&gt;         \/\/\/ &lt;param name=&quot;superAdminGroup&quot;&gt;\u0418\u043c\u044f \u0433\u0440\u0443\u043f\u043f\u044b \u0432 \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a\u0435, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0443\u0442 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u044b \u0441\u0443\u043f\u0435\u0440\u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430\u043c\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b&lt;\/param&gt;         [System.Diagnostics.CodeAnalysis.SuppressMessage(&quot;Microsoft.Security&quot;, &quot;CA2100:Review SQL queries for security vulnerabilities&quot;)]         public static void CreateSecurityTables(string superAdminGroup = null)         {             List&lt;string&gt; dbTables = new List&lt;string&gt;();             using (SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[ConnectionStringName].ConnectionString))             {                 using (SqlCommand cmd = new SqlCommand(&quot;SELECT TABLE_NAME FROM information_schema.tables WHERE TABLE_NAME LIKE 'Authorization_%'&quot;, conn))                 {                     try                     {                         conn.Open();                         using (SqlDataReader reader = cmd.ExecuteReader())                         {                             while (reader.Read())                                 dbTables.Add(reader.GetString(0));                         }                         foreach (string securityTable in tables)                             if (dbTables.Contains(securityTable))                                 dbTables.Remove(securityTable);                          cmd.Parameters.AddWithValue(&quot;@database&quot;, conn.Database);                          if (dbTables.Count == 0)                             foreach (string table in tables)                                 dbTables.Add(table);                          if (dbTables.Count != 0)                              foreach (string table in dbTables)                             {                                 switch (table)                                 {                                     case &quot;Authorization_ControlsGroup&quot;:                                         cmd.CommandText = &quot;USE &quot; + conn.Database + @&quot;                                                            SET ANSI_NULLS ON                                                            SET QUOTED_IDENTIFIER ON                                                            SET ANSI_PADDING ON                                                            CREATE TABLE [dbo].[Authorization_ControlsGroup]( \t                                                            [id] [int] IDENTITY(1,1) NOT NULL, \t                                                            [Name] [varchar](500) NOT NULL,                                                              CONSTRAINT [PK_Authorization_ControlsGroup] PRIMARY KEY CLUSTERED                                                              ([id] ASC                                                             )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]                                                             ) ON [PRIMARY]                                                             SET ANSI_PADDING OFF                                                             SET IDENTITY_INSERT [dbo].[Authorization_ControlsGroup] ON                                                             INSERT INTO [dbo].[Authorization_ControlsGroup](id,Name) VALUES(-1,'\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u044b \u0441\u0443\u043f\u0435\u0440\u0430\u0434\u043c\u0438\u043d\u0430')                                                             SET IDENTITY_INSERT [dbo].[Authorization_ControlsGroup] OFF&quot;;                                         break;                                     case &quot;Authorization_Actions&quot;:                                         cmd.CommandText = &quot;USE &quot; + conn.Database + @&quot;                                                             SET ANSI_NULLS ON                                                             SET QUOTED_IDENTIFIER ON                                                             SET ANSI_PADDING ON                                                             CREATE TABLE [dbo].[Authorization_Actions]( \t                                                            [id] [int] IDENTITY(1,1) NOT NULL, \t                                                            [Name] [varchar](500) NOT NULL, \t                                                            [Active] [bit] NOT NULL,                                                              CONSTRAINT [PK_Authorization_Actions] PRIMARY KEY CLUSTERED                                                              ([id] ASC                                                             )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]                                                             ) ON [PRIMARY]                                                             SET ANSI_PADDING OFF                                                             ALTER TABLE [dbo].[Authorization_Actions] ADD  CONSTRAINT [DF_Authorization_Actions_Active]  DEFAULT ((1)) FOR [Active]&quot;;                                         break;                                     case &quot;Authorization_ActionToGroup&quot;:                                         cmd.CommandText = &quot;USE &quot; + conn.Database + @&quot;                                                                 SET ANSI_NULLS ON                                                                 SET QUOTED_IDENTIFIER ON                                                                 CREATE TABLE [dbo].[Authorization_ActionToGroup]( \t                                                            [id] [int] IDENTITY(1,1) NOT NULL, \t                                                            [ActionID] [int] NOT NULL, \t                                                            [GroupID] [int] NOT NULL,                                                              CONSTRAINT [PK_Authorization_ActionToGroup] PRIMARY KEY CLUSTERED                                                              ([id] ASC                                                             )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]                                                             ) ON [PRIMARY]&quot;;                                         break;                                     case &quot;Authorization_Controls&quot;:                                         cmd.CommandText = &quot;USE &quot; + conn.Database + @&quot;                                                                 SET ANSI_NULLS ON                                                                 SET QUOTED_IDENTIFIER ON                                                                 SET ANSI_PADDING ON                                                                 CREATE TABLE [dbo].[Authorization_Controls]( \t                                                            [id] [int] IDENTITY(1,1) NOT NULL, \t                                                            [Name] [varchar](500) NOT NULL,                                                              CONSTRAINT [PK_Authorize_Controls] PRIMARY KEY CLUSTERED                                                              ([id] ASC                                                             )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]                                                             ) ON [PRIMARY]                                                             SET ANSI_PADDING OFF&quot;;                                         break;                                     case &quot;Authorization_ControlToGroup&quot;:                                         cmd.CommandText = &quot;USE &quot; + conn.Database + @&quot;                                                                SET ANSI_NULLS ON                                                                SET QUOTED_IDENTIFIER ON                                                                CREATE TABLE [dbo].[Authorization_ControlToGroup]( \t                                                            [id] [int] IDENTITY(1,1) NOT NULL, \t                                                            [ControlID] [int] NOT NULL, \t                                                            [GroupID] [int] NOT NULL,                                                              CONSTRAINT [PK_Authorization_ControlToGroup] PRIMARY KEY CLUSTERED                                                              (\t[id] ASC                                                             )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]                                                             ) ON [PRIMARY]&quot;;                                         break;                                     case &quot;Authorization_RoleToActionGroup&quot;:                                         cmd.CommandText = &quot;USE &quot; + conn.Database + @&quot;                                                              SET ANSI_NULLS ON                                                              SET QUOTED_IDENTIFIER ON                                                              SET ANSI_PADDING ON                                                              CREATE TABLE [dbo].[Authorization_RoleToActionGroup]( \t                                                            [id] [int] IDENTITY(1,1) NOT NULL, \t                                                            [ActionGroup] [int] NOT NULL, \t                                                            [Role] [varchar](500) NOT NULL,                                                              CONSTRAINT [PK_Authorization_RoleToActionGroup] PRIMARY KEY CLUSTERED                                                              ([id] ASC                                                             )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]                                                             ) ON [PRIMARY]                                                             SET ANSI_PADDING OFF                                                             ALTER TABLE [dbo].[Authorization_RoleToActionGroup] ADD  CONSTRAINT [DF_Authorization_RoleToActionGroup_ActionGroup]  DEFAULT ((-1)) FOR [ActionGroup]&quot;;                                         break;                                     case &quot;Authorization_RoleToControlGroup&quot;:                                         cmd.CommandText = &quot;USE &quot; + conn.Database + @&quot;                                                              SET ANSI_NULLS ON                                                              SET QUOTED_IDENTIFIER ON                                                              CREATE TABLE [dbo].[Authorization_RoleToControlGroup]( \t                                                            [id] [int] IDENTITY(1,1) NOT NULL, \t                                                            [RoleID] [int] NOT NULL, \t                                                            [GroupID] [int] NOT NULL,                                                              CONSTRAINT [PK_Authorization_RoleToControlGroup] PRIMARY KEY CLUSTERED                                                              ([id] ASC                                                             )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]                                                             ) ON [PRIMARY]&quot;;                                         break;                                     case &quot;Authorization_ActionGroups&quot;:                                         cmd.CommandText = &quot;USE &quot; + conn.Database + @&quot;                                                                SET ANSI_NULLS ON                                                                SET QUOTED_IDENTIFIER ON                                                                SET ANSI_PADDING ON                                                                CREATE TABLE [dbo].[Authorization_ActionGroups]( \t                                                            [id] [int] IDENTITY(1,1) NOT NULL, \t                                                            [Name] [varchar](500) NOT NULL, \t                                                            [active] [bit] NOT NULL,                                                              CONSTRAINT [PK_Authorization_ActionGroups] PRIMARY KEY CLUSTERED                                                              ( \t                                                            [id] ASC                                                             )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]                                                             ) ON [PRIMARY]                                                                SET ANSI_PADDING OFF                                                                ALTER TABLE [dbo].[Authorization_ActionGroups] ADD  CONSTRAINT [DF_Authorization_ActionGroups_active]  DEFAULT ((1)) FOR [active]                                                                SET IDENTITY_INSERT [dbo].[Authorization_ActionGroups] ON                                                                INSERT INTO [dbo].[Authorization_ActionGroups](id,Name) VALUES(0,'\u0412\u0441\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u044b')                                                                SET IDENTITY_INSERT [dbo].[Authorization_ActionGroups] OFF&quot;;                                         break;                                 }                                 cmd.ExecuteNonQuery();                             }                         if (!string.IsNullOrEmpty(superAdminGroup) && Web.Security.Utilization.Authorization.SystemRole.IntranetRoleID(superAdminGroup) != null)                         {                             cmd.CommandText = @&quot;INSERT INTO Authorization_RoleToActionGroup(ActionGroup,Role) VALUES(0,@group)                                                 INSERT INTO Authorization_RoleToControlGroup(RoleID,GroupID) VALUES(@role,-1)&quot;;                             cmd.Parameters.Clear();                             cmd.Parameters.AddWithValue(&quot;@group&quot;, superAdminGroup);                             cmd.Parameters.AddWithValue(&quot;@role&quot;, Web.Security.Utilization.Authorization.SystemRole.IntranetRoleID(superAdminGroup));                             cmd.ExecuteNonQuery();                         }                                                  }                     catch (Exception ex)                     {                         if (Configuration.s_log != null)                             Configuration.s_log.Error(&quot;[\u041e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438] [\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438] &quot;, ex);                     }                 }             }         }          public static void RecreateTables(string superAdminGroup = null)         {             string command = &quot;DROP TABLE {0}&quot;;             using (SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[ConnectionStringName].ConnectionString))             {                 using (SqlCommand cmd = new SqlCommand(&quot;&quot;, conn))                 {                     try                     {                         conn.Open();                         foreach (string table in tables)                         {                             cmd.CommandText = string.Format(command, table);                             cmd.ExecuteNonQuery();                         }                     }                     catch (Exception ex)                     {                         if (Configuration.s_log != null)                             Configuration.s_log.Error(&quot;[\u041e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u043b\u0443\u0434\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438] [\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0435\u0440\u0435\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438] &quot;, ex);                     }                 }             }             CreateSecurityTables(superAdminGroup);         }      } } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u042d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432\u0441\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0438 \u043a\u0430\u043a \u0431\u043e\u043d\u0443\u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c\u0438 \u043c\u043e\u0434\u0443\u043b\u044f.<\/p>\n<p>  \u041f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 <a href=\"https:\/\/github.com\/EkzoMan\/Ekzo.Security\">GitHub<\/a><\/p>\n<h5>\u0412\u043c\u0435\u0441\u0442\u043e \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f<\/h5>\n<p>  \u041e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043c\u043d\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 Employee \u0432\u043f\u043e\u043b\u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u043f\u0443\u0449\u0435\u043d, \u043d\u043e \u0432 \u0441\u0432\u043e\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u044f \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0435\u0433\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u0441\u0442\u0430\u043b \u0443\u0431\u0438\u0440\u0430\u0442\u044c \u0438\u0437 \u043c\u043e\u0434\u0443\u043b\u044f.<br \/>  \u0414\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0440\u043e\u043b\u044f\u043c\u0438 \u0431\u044b\u043b \u0441\u043e\u0437\u0434\u0430\u043d \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u0431\u044b\u0441\u0442\u0440\u043e \u0438 \u0443\u0434\u043e\u0431\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c\/\u0443\u0434\u0430\u043b\u044f\u0442\u044c\/\u043c\u0435\u043d\u044f\u0442\u044c \u0440\u043e\u043b\u0438 \u0438 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438. \u041d\u043e \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043c\u043e\u0434\u0443\u043b\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0433\u043e \u044f \u043d\u0435 \u0432\u044b\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e.<br \/>  <i>\u0415\u0449\u0435 \u0440\u0430\u0437 \u043f\u0440\u043e\u0448\u0443 \u043d\u0435 \u043a\u0438\u0434\u0430\u0442\u044c \u043f\u043e\u043c\u0438\u0434\u043e\u0440\u0430\u043c\u0438. \u0412\u0435\u0441\u044c \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0438 \u043f\u0440\u043e\u0435\u043a\u0442, \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u043d\u0430 GitHub&#8217;\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u0435\u0440\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0433\u043e\u0432\u043d\u043e\u043a\u043e\u0434\u0430.<\/i>    \t<\/p>\n<div class=\"clear\"><\/div>\n<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/191218\/\"> http:\/\/habrahabr.ru\/post\/191218\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\">   \t\u041e\u0447\u0435\u043d\u044c \u0447\u0430\u0441\u0442\u043e \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u044e\u0441\u044c \u0441 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0430\u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0440\u0430\u0437\u0434\u0435\u043b\u0430\u043c \u0441\u0430\u0439\u0442\u0430 \u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f.<br \/>  \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u043b\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 ASP MVC \u00ab\u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438\u00bb, \u043d\u043e, \u0441\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c, \u044f \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f \u0441 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0430\u0432. \u0415\u0441\u043b\u0438 \u0442\u0435\u0431\u0435, \u0443\u0432\u0430\u0436\u0430\u0435\u043c\u044b\u0439 %habrauser%, \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u0434\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434 \u043a\u0430\u0442.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-191218","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/191218","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=191218"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/191218\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=191218"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=191218"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=191218"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}