ASP.NET MVC 4 कस्टम अनुमति अनुमति कोड के साथ विशेषता (भूमिकाओं के बिना)


121

मुझे अपने MVC 4 एप्लिकेशन में उपयोगकर्ताओं के विशेषाधिकार के स्तर (उपयोगकर्ताओं को सौंपे गए CRUD ऑपरेशन स्तरों के लिए केवल विशेषाधिकार स्तर नहीं हैं) के आधार पर विचारों तक पहुंच को नियंत्रित करने की आवश्यकता है।

उदहारण के लिए; AuthorizeUser के नीचे मेरी कस्टम विशेषता होगी और मुझे इसे इस तरह उपयोग करने की आवश्यकता है:

[AuthorizeUser(AccessLevels="Read Invoice, Update Invoice")]
public ActionResult UpdateInvoice(int invoiceId)
{
   // some code...
   return View();
}


[AuthorizeUser(AccessLevels="Create Invoice")]
public ActionResult CreateNewInvoice()
{
  // some code...
  return View();
}


[AuthorizeUser(AccessLevels="Delete Invoice")]
public ActionResult DeleteInvoice(int invoiceId)
{
  // some code...
  return View();
}

क्या ऐसा करना संभव है?

जवाबों:


243

मैं एक कस्टम विशेषता के साथ ऐसा कर सकता है।

[AuthorizeUser(AccessLevel = "Create")]
public ActionResult CreateNewInvoice()
{
    //...
    return View();
}

कस्टम विशेषता वर्ग निम्नानुसार है।

public class AuthorizeUserAttribute : AuthorizeAttribute
{
    // Custom property
    public string AccessLevel { get; set; }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var isAuthorized = base.AuthorizeCore(httpContext);
        if (!isAuthorized)
        {                
            return false;
        }

        string privilegeLevels = string.Join("", GetUserRights(httpContext.User.Identity.Name.ToString())); // Call another method to get rights of the user from DB

        return privilegeLevels.Contains(this.AccessLevel);           
    }
}

आप विधि AuthorisationAttributeको ओवरराइड करके अपने कस्टम में अनधिकृत उपयोगकर्ता को पुनर्निर्देशित कर सकते हैं HandleUnauthorizedRequest:

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
    filterContext.Result = new RedirectToRouteResult(
                new RouteValueDictionary(
                    new
                        { 
                            controller = "Error", 
                            action = "Unauthorised" 
                        })
                );
}

मैंने HandleUnauthorizedRequest के आपके उदाहरण की कोशिश की है, लेकिन जब मैं रूटवैल्यूडॉर को निर्दिष्ट करता हूं, तो यह मेरे लिए एक मार्ग को पुनर्निर्देशित करता है जो मौजूद नहीं है। यह उस मार्ग को जोड़ता है जिसे मैं उपयोगकर्ता को उस मार्ग पर पुनर्निर्देशित करना चाहता हूं जिस मार्ग तक उपयोगकर्ता पहुँचना चाहता था ... सी मुझे कुछ इस तरह मिलती है: लोकलहोस्ट: 9999 / एडमिन / होम जब मुझे लोकलहोस्ट चाहिए: 9999 / होम
मरीन

1
@ मेरिन क्षेत्र जोड़ने की कोशिश करें = string.Empty में रूटवैल्यूड
एलेक्स

30
मैं उत्थान कर रहा था, लेकिन फिर मैंने देखा कि "अगर (शर्त) {वापसी सच?} और {वापसी झूठी;}" अंत में ....
गैब्रियलबीबी

1
@ ईमिल मैं बस बूलियन को वापस कर दूंगा जो String.Contains विधि ने मुझे दिया। लेकिन यह अप्रासंगिक है, मैं नीच नहीं था, मैंने सिर्फ हेव अप नहीं किया।
गेब्रियलबी

2
.Name.ToString()बेमानी है, क्योंकि Nameसंपत्ति पहले से ही स्ट्रिंग है
FindOutIslamNow

13

यहाँ प्रचलित के लिए एक संशोधन है। जवाब। मुख्य अंतर यह है कि जब उपयोगकर्ता प्रमाणित नहीं होता है, तो यह लॉगिन पृष्ठ पर रीडायरेक्ट करने के लिए मूल "हैंडलेउनॉटहोरीराइज्ड रीपेस्ट" विधि का उपयोग करता है:

   protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {

        if (filterContext.HttpContext.User.Identity.IsAuthenticated) {

            filterContext.Result = new RedirectToRouteResult(
                        new RouteValueDictionary(
                            new
                            {
                                controller = "Account",
                                action = "Unauthorised"
                            })
                        );
        }
        else
        {
             base.HandleUnauthorizedRequest(filterContext);
        }
    }

3

हो सकता है कि यह भविष्य में किसी के लिए भी उपयोगी हो, मैंने इस तरह से एक कस्टम प्राधिकृत विशेषता को लागू किया है:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class ClaimAuthorizeAttribute : AuthorizeAttribute, IAuthorizationFilter
{
    private readonly string _claim;

    public ClaimAuthorizeAttribute(string Claim)
    {
        _claim = Claim;
    }

    public void OnAuthorization(AuthorizationFilterContext context)
    {
        var user = context.HttpContext.User;
        if(user.Identity.IsAuthenticated && user.HasClaim(ClaimTypes.Name, _claim))
        {
            return;
        }

        context.Result = new ForbidResult();
    }
}

0

यदि आप दावे के साथ वेब एपीआई का उपयोग करते हैं, तो आप इसका उपयोग कर सकते हैं:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true)]
public class AutorizeCompanyAttribute:  AuthorizationFilterAttribute
{
    public string Company { get; set; }

    public override void OnAuthorization(HttpActionContext actionContext)
    {
        var claims = ((ClaimsIdentity)Thread.CurrentPrincipal.Identity);
        var claim = claims.Claims.Where(x => x.Type == "Company").FirstOrDefault();

        string privilegeLevels = string.Join("", claim.Value);        

        if (privilegeLevels.Contains(this.Company)==false)
        {
            actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized, "Usuario de Empresa No Autorizado");
        }
    }
}
[HttpGet]
[AutorizeCompany(Company = "MyCompany")]
[Authorize(Roles ="SuperAdmin")]
public IEnumerable MyAction()
{....
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.