עבודה מוגנת עם OData

צודק, אני אכן שובר על זה את הראש,

ואין לי שום רעיון.
דוקא לגבי ה odata אני די מתקרב לפתרון. הוא לא אלגנטי במיוחד, אבל צריך לעבוד.
&nbsp
 
עבודה מוגנת עם OData

למי שיצא לעבוד עם Odata : אני בונה מערכת שהיא saas. כל לקוח נכנס למערכת ורואה רק את הנתונים שלו. השאלה, איך לממש את זה כשהקונטרולרים הם מסוג odata.
לדוגמה, יש קונטרולר של מוצרים, שאתה יכול לקבל את כל המוצרים, או לבצע שאילתות דרך ה url לקבל רק נתונים חלקיים, מיון, סידור, דפדוף, וכל השאר.
הבעיה: אני רוצה להפעיל על כל הדבר הזה סינון-על, כלומר שכל המסננים שמגיעים מה url יעבדו, אבל בהינתן שבטבלת המוצרים אתה מוסיף where clientid=1234 .
ולא הייתי רוצה להוסיף את זה ל url מסיבות ברורות של אבטחה.
צד הלקוח הוא גריד של kendoui ששולח שאילתות ל odata endpoint . המשתמשים עושים לוגאין, כך שיש לי בצד שרת את ה userid .
 
מה הבעיה?

public class ProductsController : ODataController{
ProductsContext db = new ProductsContext();
private IQueryable<Product> GetUserProducts() { return db.Products.Where(p => p.ClientId == CurrentUser.Id); } [EnableQuery] public IQueryable<Product> Get() { return GetUserProducts(); } [EnableQuery] public SingleResult<Product> Get([FromODataUri] int key) { IQueryable<Product> result = GetUserProducts().Where(p => p.Id == key); return SingleResult.Create(result); }}
 
צודק.

כשנכנסתי לקוד של הקונטרולר ראיתי שזה באמת פשוט להוסיף תנאי לשליפה, וככה עשיתי. ובדיקה דומה הוספתי במחיקה, בעדכון, וכן הלאה. שלא ינסה מישהו למחוק רשומה שלא שלו, ודברים כאלה.
תודה רבה!
 
דבר אחד לא הבנתי

מה כוונתך "כשנכנסתי לקוד של הקונטרולר ראיתי".
אתה יוצר את הקונטרוללרים עם דיזיינר כלשהוא, שאתה צריך "להכנס לקוד", כאילו מדובר בכניסה למקום שמור ומוגן.

הוספה: מכיוון שאתה רוצה להחיל את הפילטר הזה על כל הקונטרולרים, עדיף להמנע מלהחיל את הפילטר בכל מתודה בנפרד, כי אז אתה עלול לשכוח אותו. לכן נראה לי שהשיטה שהצגתי, עדיפה.

אפשר לשכלל ולרשת תמיד ממחלקה אבסטרקטית [גנרית] MyControllerBase<TEntity, עם מתודה אבסטרקטית שמחזירה את הQuerable המפולטר.
כך תוכל לחסוך בקוד: את המתודה Get אתה יכול לממש במחלקת האב, ולא בכל קונטרוללר, וגם את מימוש IDisposable [אם אתה מקפיד לממש זאת]
 
הסבר

כל נושא ה odata די חדש בשבילי, אני כל פעם בודק אותו, מקבל סטירה שמשהו מאד יסודי לא עובד, ועוזב וחוזר לפתרונות אחרים.
את הקונטרולרים אני יוצר אוטומטית על ידי ה scaffold של VS . ולא אשקר לך שאת כל הקוד שם אני מבין. אבל קטע ה linq שם הוא מאד פשוט, ואין בעיה להוסיף לו where קטן, בדיוק מה שאני צריך שם. (וזה בדיוק מה שכתבת, לא?)
כן, אפשר לעשות משהו גנרי, baseController שיעשה את הפילטור הזה, ולרשת ממנו.
&nbsp
אגב, משהו שלמדתי מניסיון מר ואחרי ימים רבים מבוזבזים: webapi רגיל, ו odata - הם כנראה כמו מים וחשמל. לא טוב לערבב, התוצאות לא טובות ולא צפויות. בגים על כל צעד ושעל, והודעות שגיאה מוזרות ובלתי צפויות. אם יש לך בפרויקט odata - תן לו פרויקט משלו, ונפרד מהפרויקט בו אתה מחזיק webapi . הם יכולים להיות כמובן תחת אותו סולושן. למעוניינים יש לי מאמר שמסביר איך כן לגרום להם לעבוד ביחד באותו project - אבל זה טריקי.
&nbsp
 
למעלה