سؤال

المشكلة التي أراها مع هذا الرمز، هي أنه سيتم إعادة استخدامها كثيرا؛ سيتم تحرير أي شيء يتم تحريره / تم إنشاؤه بواسطة مستخدم مصادق (باستثناء مسؤوليات الموقع) فقط الوصول إلى كائنات "الاستوديوهات" الخاصة بهم.

سؤالي لكم جميعا؛ كيف يمكنك إعادة عامل هذا حتى يمكن استخراج طبقة الخدمة بعيدا عن معرفة العميل. أنوي إعادة استخدام طبقة الخدمة في تطبيق سطح مكتب مستقل لاحقا.

يرجى إلقاء بعض الضوء على طرقي الخاطئة! أنا أقدر ذلك كثيرا.

Authorizeownerattribute.cs. (Authorizeattribute)

protected override bool AuthorizeCore(HttpContextBase httpContext)
{
    // Get the authentication cookie
    string cookieName = FormsAuthentication.FormsCookieName;
    HttpCookie authCookie = httpContext.Request.Cookies[cookieName];

    // If the cookie can't be found, don't issue the ticket
    if (authCookie == null) return false;

    // Get the authentication ticket and rebuild the principal & identity
    FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
    string[] userData = authTicket.UserData.Split(new[] { '|' });

    int userId = Int32.Parse(userData[0]);
    int studioID = Int32.Parse(userData[1]);
    GenericIdentity userIdentity = new GenericIdentity(authTicket.Name);
    WebPrincipal userPrincipal = new WebPrincipal(userIdentity, userId, studioID);
    httpContext.User = userPrincipal;

    return true;
}

داخل جهاز تحكم "المستخدم" الخاص بي إرفاق هذه السمة إلى أي طريقة تتطلب مالك

    [AuthorizeOwner]
    public ActionResult Edit(int Id)
    {
        IUser user = userService.GetById(HttpContext.User, Id);
        return View(user);
    }

الآن، في طبقة الخدمة الخاصة بي هي المكان الذي أتحقق من مرحلة IPRINCIPAL مرت ما إذا كان لديه حق الوصول إلى الكائن المطلوب. هذا هو المكان الذي تحصل عليه رائحة كريهة:

userservice.cs.

    public IUser GetById(IPrincipal authUser, int id)
    {
        if (authUser == null) throw new ArgumentException("user");

        WebPrincipal webPrincipal = authUser as WebPrincipal;
        if (webPrincipal == null) throw new AuthenticationException("User is not logged in");

        IUser user = repository.GetByID(id).FirstOrDefault();
        if (user != null)
        {
            if (user.StudioID != webPrincipal.StudioID) throw new AuthenticationException("User does not have ownership of this object");
            return user;
        }

        throw new ArgumentException("Couldn't find a user by the id specified", "id");
    }
هل كانت مفيدة؟

المحلول

لست متأكدا من أنني سأخفف المعرفات الفعلية في ملف تعريف الارتباط، وهذا يتعرض قليلا جدا. سأكون أكثر ميلا لاستخدام جلسة التجزئة لتخزين تلك البيانات وبالتالي إبقاء عليه على الخادم وعدم كشفها.

أود أيضا استخدام النموذج (عن طريق تمرير المستخدم) لتحديد الكائنات التي بالعودة، أي تلك التي تحتوي على استوديع مطابقة. وبهذه الطريقة سيتعين على وحدة التحكم الخاصة بك فقط استدعاء "GetObjects (INT IND)"، إذا لم يكن لديهم حق الوصول إلى أي شيء، فستحصل على مجموعة فارغة أو فارغة. هذا يشعر أنظف لي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top