এএসপি.নেট এমভিসি 4 কাস্টম অনুমোদনের কোডগুলির সাথে অনুমোদিত (অনুমোদিত কোনও ভূমিকা ছাড়াই নয়)


121

আমার এমভিসি 4 অ্যাপ্লিকেশনে ব্যবহারকারীর সুবিধাগুলির স্তরের (ব্যবহারকারীদের জন্য নির্ধারিত CRUD অপারেশন মাত্রাগুলির জন্য কোনও ভূমিকা নেই, কেবলমাত্র সুবিধার স্তর রয়েছে) এর ভিত্তিতে আমার ভিউগুলিতে অ্যাক্সেস নিয়ন্ত্রণ করতে হবে।

উদাহরণ হিসাবে; অথরিজ ইউজারের নীচে আমার কাস্টম বৈশিষ্ট্য হবে এবং আমার এটি এ জাতীয় ব্যবহার করা দরকার:

[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" 
                        })
                );
}

আমি আপনার হ্যান্ডলঅনোর্ডাইজড রিক্যুয়েস্টের উদাহরণটি চেষ্টা করেছি কিন্তু যখন আমি রুটভ্যালিউড অভিধানটি নির্দিষ্ট করি তখন এটি কেবল আমার কাছে এমন একটি পথ পুনঃনির্দেশ করে যা অস্তিত্বহীন। এটি যে রুটটি ব্যবহারকারীর অ্যাক্সেস করতে চেয়েছিল আমি সেই ব্যবহারকারীকে পুনঃনির্দেশ করতে চাই সেই রুটে সংযোজন করেছে ... সি আমি লোকালহোস্ট: 9999 / অ্যাডমিন / হোম চাই এমন কিছু পেয়েছি: 9999 / হোম
মেরিন

1
@ মেরিন ক্ষেত্রফল = স্ট্রিং যোগ করার চেষ্টা করুন Rou রাউটভ্যালু অভিধানে এমপিটি
অ্যালেক্স

30
আমি উজ্জীবিত হয়েছি কিন্তু তখন আমি দেখেছি "যদি (শর্ত) true সত্য প্রত্যাবর্তন;} অন্যথায় false মিথ্যা প্রত্যাবর্তন;}" শেষে ....
গ্যাব্রিয়েলবিবি

1
@ ইমিল আমি কেবল স্ট্রিং.কন্টেইনস পদ্ধতিটি আমাকে যে বুলিয়ানটি দিয়েছিলাম তা কেবল ফিরিয়ে আনব। তবে এটি অপ্রাসঙ্গিক, আমি উঁচুতে যাইনি, আমি কেবল উর্ধ্বে ছিলাম না।
গ্যাব্রিয়েলবিবি

2
.Name.ToString()অপ্রয়োজনীয়, যেহেতু Nameসম্পত্তি ইতিমধ্যে স্ট্রিং রয়েছে
FindOutIslamNow

13

এখানে পূর্বের জন্য একটি পরিবর্তন রয়েছে। উত্তর. প্রধান পার্থক্যটি হল যখন ব্যবহারকারী প্রমাণীকৃত না হয়, এটি লগইন পৃষ্ঠাতে পুনর্নির্দেশের জন্য মূল "HandleUnauthorisedRequest" পদ্ধতিটি ব্যবহার করে:

   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

আপনি যদি দাবি সহ WEB এপিআই ব্যবহার করেন তবে আপনি এটি ব্যবহার করতে পারেন:

[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()
{....
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.