मेरे पास ऐसी स्थिति है जहां मुझे अपने कस्टम प्राधिकरण विशेषता में एक कस्टम फ़िल्टर, अर्थात्, मेरे कस्टम प्राधिकरण प्रदाता में कुछ निर्भरताओं को इंजेक्ट करने की आवश्यकता है। मैंने बहुत से लोगों और पदों पर ठोकर खाई जो कह रहे थे कि हमें 'व्यवहार' से 'विशेषता मेटाडाटा' को अलग करना चाहिए। यह समझ में आता है और यह भी तथ्य है कि फ़िल्टर गुणों को 'निर्भरता रीसोलवर' के माध्यम से तत्काल नहीं किया जाता है, इसलिए निर्भरताओं को इंजेक्ट करना मुश्किल होता है।IFilterProvider और चिंताओं को अलग करना
इसलिए मैंने अपने कोड का थोड़ा सा रिफैक्टरिंग किया और मैं जानना चाहता था कि मेरे पास यह सही है (मैं डीआई फ्रेमवर्क के रूप में कैसल विंडसर का उपयोग कर रहा हूं)।
सबसे पहले मैं अपने गुण छीन केवल कच्चे डेटा मैं
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class MyAuthorizeAttribute : Attribute
{
public string Code { get; set; }
}
मैं एक कस्टम प्राधिकरण फिल्टर है कि यह निर्धारित करने के लिए वर्तमान उपयोगकर्ता उचित प्राधिकरण
public class MyAuthorizationFilter : IAuthorizationFilter
{
private IAuthorizationProvider _authorizationProvider;
private string _code;
public MyAuthorizationFilter(IAuthorizationProvider authorizationProvider, string code)
{
Contract.Requires(authorizationProvider != null);
Contract.Requires(!string.IsNullOrWhiteSpace(code));
_authorizationProvider = authorizationProvider;
_code = code;
}
public void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext == null)
{
throw new ArgumentNullException("filterContext");
}
if (filterContext.HttpContext.Request.IsAuthenticated)
{
BaseController controller = filterContext.Controller as BaseController;
if (controller != null)
{
if (!IsAuthorized(controller.CurrentUser, controller.GetCurrentSecurityContext()))
{
// forbidden
filterContext.RequestContext.HttpContext.Response.StatusCode = 403;
if (filterContext.RequestContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.Result = new RedirectToRouteResult("default", new RouteValueDictionary(new
{
action = "http403",
controller = "error"
}), false);
}
else
{
filterContext.Result = controller.InvokeHttp404(filterContext.HttpContext);
}
}
}
else
{
}
}
else
{
filterContext.Result = new RedirectResult(FormsAuthentication.LoginUrl);
}
}
private bool IsAuthorized(MyUser user, BaseSecurityContext securityContext)
{
bool has = false;
if (_authorizationProvider != null && !string.IsNullOrWhiteSpace(_code))
{
if (user != null)
{
if (securityContext != null)
{
has = _authorizationProvider.HasPermission(user, _code, securityContext);
}
}
}
else
{
has = true;
}
return has;
}
}
है के तर्क होते हैं बनाया जरूरत को रोकने के लिए
अंतिम भाग एक कस्टम फ़िल्टर प्रदाता बनाना था जो इस विशिष्ट विशेषता को लाएगा और मेरे कस्टम फ़िल्टर को इसकी निर्भरताओं को पारित करेगा और किसी भी डेटा को विशेषता से निकाला जाएगा।
public class MyAuthorizationFilterProvider : IFilterProvider
{
private IWindsorContainer _container;
public MyAuthorizationFilterProvider(IWindsorContainer container)
{
Contract.Requires(container != null);
_container = container;
}
public IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor)
{
Type controllerType = controllerContext.Controller.GetType();
var authorizationProvider = _container.Resolve<IAuthorizationProvider>();
foreach (MyAuthorizeAttribute attribute in controllerType.GetCustomAttributes(typeof(MyAuthorizeAttribute), false))
{
yield return new Filter(new MyAuthorizationFilter(authorizationProvider, attribute.Code), FilterScope.Controller, 0);
}
foreach (MyAuthorizeAttribute attribute in actionDescriptor.GetCustomAttributes(typeof(MyAuthorizeAttribute), false))
{
yield return new Filter(new MyAuthorizationFilter(authorizationProvider, attribute.Code), FilterScope.Action, 0);
}
}
}
अंतिम चरण Global.asax
FilterProviders.Providers.Add(new MyAuthorizationFilterProvider(_container));
तो मैं पहले सोच रहा हूँ में फिल्टर प्रदाता रजिस्टर, अगर मैं विचार का अधिकार मिल गया और दूसरा, क्या सुधार किया जा सकता है।
हाय फ्रेंकोइस, मैं आपके जैसी ही समस्या के लिए एक बहुत ही समान समाधान के साथ आया था। मैं वर्तमान में खुद को वही प्रश्न पूछ रहा हूं जैसा आप थे। क्या आपने इस समाधान का उपयोग कर समाप्त किया? समय के साथ इसके साथ कोई समस्या है? क्या आपके पास कोई सिफारिश है? धन्यवाद। –