سؤال

لدي قاعدة بيانات تسمى MyDB في مثيل Microsoft SQL Server 2008 Express باستخدام مصادقة الوضع المختلط. يتصل التطبيق باستخدام قاعدة البيانات MyDB حاليًا باستخدام مصادقة Windows ، باستخدام بيانات اعتماد Windows للمستخدم الحالي. يعد تسجيل الدخول هذا عضوًا في دور الخادم "العام" ، وله مستخدم تم تعيينه إليه في قاعدة بيانات MYDB. مستخدم قاعدة البيانات هذا هو عضو في أدوار قاعدة بيانات DB_DATAREADER و DB_DATAWRITER.

ما أود هو أنه عندما يتصل التطبيق ، يكون للأذونات للقراءة والكتابة في MyDB. ولكن عندما يتصل تطبيق آخر باستخدام نفس تسجيل الدخول ، يجب السماح له فقط بالقراءة.

كان فكرتي أنني سأقوم بإنشاء مشغل تسجيل الدخول ، والذي سيتحقق من جزء اسم التطبيق من سلسلة الاتصال ، وبناءً على ذلك ، حدد ما إذا كان ينبغي تبديل سياق التنفيذ. (للسجل ، أعلم أنه ليس من الآمن بأي حال الاعتماد على اسم تطبيق سلسلة الاتصال ، وأنه من السهل جدًا التحايل عليه. الغرض هنا هو عدم تأمين قاعدة البيانات ، ولكن لمساعدة المستخدمين على تجنب التغيير البيانات عند الاتصال باستخدام تطبيق آخر ، مثل Microsoft Excel)

لقد قمت بإنشاء تسجيل دخول جديد يسمى "myapp_reader" تم تعيينه إلى مستخدم في قاعدة بيانات MyDB ، وهي عضو في DB_Datareader.

ثم حاولت إنشاء مشغل تسجيل الدخول مع TSQL التالي:

CREATE TRIGGER CheckUser
ON ALL SERVER
AFTER LOGON AS
BEGIN
IF APP_NAME() <> 'My Application Name'
    BEGIN
        EXECUTE AS LOGIN = 'myapp_reader' WITH NO REVERT
    END
END

لكن لسوء الحظ ، لا يعمل. عندما أحاول الاتصال أحصل على الخطأ التالي:

فشل تسجيل الدخول في تسجيل الدخول "MyComputer mywindowsusername" بسبب تنفيذ الزناد.
تم تغيير سياق قاعدة البيانات إلى "Master".
تم تغيير إعداد اللغة إلى US_ENGISH. (خادم Microsoft SQL ، خطأ: 17892)

وعندما أنظر في خطأ الخطأ ، يقول:

خطأ: 15590 ، الشدة: 16 ، الحالة: 1.
لا يمكن إلا استخدام خيارات "لا عودة" أو "ملف تعريف الارتباط" باستخدام عبارة "تنفيذ" على مستوى Adhoc.
خطأ: 17892 ، الشدة: 20 ، الحالة: 1.
فشل تسجيل الدخول في تسجيل الدخول "MyComputer mywindowsusername" بسبب تنفيذ الزناد. [العميل: xxx.xxx.xxx.xxx

هل يعني هذا الخطأ أنه لا يمكنني تغيير سياق التنفيذ بشكل دائم في مشغل تسجيل الدخول؟

هل كانت مفيدة؟

المحلول

لا أعتقد أنه من الممكن تغيير سياق التنفيذ للجلسة بأكملها. يمكنك إنشاء مشغل DML لإدراج وتحديث وحذف كل جدول/عرض في قاعدة البيانات الخاصة بك والذي يقوم بتراجع عن App_Name () معين. يمكنك كتابة إجراء لأتمتة إنشاء كل هذه المشغلات.

بدلاً من ذلك ، إذا كان لديك خيار وجود تطبيقات مثل Excel الاتصال عبر خادم مرتبط ، فيمكنك تغيير سياق التنفيذ في هذه المرحلة. وقم بإنشاء مشغل تسجيل دخول يقوم بإعادة الاتصال إذا حاول المستخدمون الاتصال عبر Excel أو تطبيقات أخرى مباشرة إلى الخادم.

نصائح أخرى

على افتراض أن لديك التحكم في التطبيق ويمكنك تعديله ، فإن أدوار التطبيق ستفعل ما تريده بالضبط. انظر SP_SetApprole في الكتب عبر الإنترنت للبدء.

لا يمكنك القيام بذلك بالطريقة التي تريدها.

  • يحتوي اتصال المستخدم على نفس بيانات الاعتماد في جميع أنحاء باستثناء بعض النطاقات المحددة باستخدام تنفيذ AS.
  • لقد أدركت أنه لا يمكنك الاعتماد على app_name () أو host_name () لاكتشاف عندما يتصل شخص ما بشكل مختلف ، مما يعني أن المشغل التراجع لكل جدول لا يمكن الاعتماد عليه هناك
  • يعتمد تطبيقك على الجدول المباشر للكتابة

بعض الخيارات التي يمكنني التفكير فيها ...

  • يستخدم تطبيقك Procs المخزنة ، وقد قرأ المستخدمون الوصول فقط إلى الجداول
  • استخدم SET CONTEXT_INFO في تطبيقك لتعيين مفتاح "سري" لمشغلات التراجع
  • قم بتغيير التطبيق الخاص بك لاستخدام حساب الخدمة/هو خدمة Windows/ETC والوكلاء الموجودين في اسم المستخدم (كما ستفعل صفحة ويب)
  • ... أو بعض التباديل

تحتاج حقًا إلى اتخاذ قرار بشأن كيفية تنظيم بيانات الاعتماد وإدارتها أولاً.

إذا كنت تستخدم sp_setapprole التي ستحايل على مصادقة Windows وتسمح بالوصول من خلال هذا التطبيق لأي مستخدم. إذا كان هذا هو ما تريد فعله حقًا ، فإذا كان التطبيق خادمًا ، قم بإنشاء حساب مستخدم لهذا التطبيق وقم بتشغيله ضمن بيانات اعتماد هذا المستخدم.

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

وأيضًا إذا لم يكن هذا التطبيق موثوقًا بأن يكون نظيفًا ومعرفة ما الذي يفعله ، فاطلب منه مراجعة التعليمات البرمجية قبل السماح له بلمس SQL Server. إذا كان تطبيقك الخاص ، فابدأ في الثقة في نفسك :-)

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