سؤال

كنت أتساءل إذا كان/كيف يمكنني تجاوز الافتراضي [الإذن] السلوك في ASP.NET MVC.وأنا أعلم أنني يمكن إنشاء عمل جديد فلتر, جعل بلدي السمة وما إلى ذلك ؛ أنا فقط مهتم إذا كنت ببساطة تغيير [الإذن] السلوك محل عمل هذا

تحرير:الرجال والفتيات.أنا أقدر مداخلتك ولكن كما كتبت أنا لا تبحث إدخال جديد [XYZAuthorize] السمة.أنا على بينة من كيفية القيام بذلك.أريد أن تبقي [الإذن] التدوين ولكن فقط تغيير الطريقة التي يعمل بها.

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

المحلول

نعم, نلقي نظرة على MSDN مستندات AuthorizeAttribute: http://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute.aspx.

أساسا يمكنك تجاوز OnAuthorization() أسلوب تخصيص السلوك.هناك طرق افتراضية على السمة كذلك.

تحرير:كما برونو أشار يمكنك تجاوز AuthorizeCore الأسلوب ().والفرق الرئيسي هو أن AuthorizeCore() يأخذ HttpContextBase ، في حين OnAuthorization() يأخذ AuthorizationContext.مثيل AuthorizationContext يوفر لك المزيد من المعلومات ، مثل وحدة تحكم ، RequestContext و RouteData.كما أنه يتيح لك تحديد ActionResult.

AuthorizeCore() هو أكثر تقييدا في المعلومات يمكنك الوصول وكذلك نتيجة يمكنك العودة, ولكن إذا كنت بحاجة إلى أن يأذن البيانات المخزنة مؤقتا ، ثم المنطق الخاص بك يحتاج إلى التعامل مع هذه القضية حيث لم يكن لديك أي من تلك البيانات الإضافية (بما البيانات من ذاكرة التخزين المؤقت قبل أن يتم توجيه الطلب من خلال MVC أنابيب).

كما هو الحال دائما, تحتاج إلى فهم السيناريو الخاص بك و الأدوات المتاحة في المفاضلة بينهما.

نصائح أخرى

يمكنك تصنيف مرشح الفوتوشرات المؤلف ووضع المنطق الخاص بك داخلها.

دعونا نرى مثالا. دعنا نقول أنك تريد تخويل الاتصالات المحلية دائما. ومع ذلك، إذا كان ذلك اتصالا عن بعد، فهل ترغب في الاحتفاظ بمنطق التفويض المعتاد.

يمكنك أن تفعل شيئا مثل:

public class LocalPermittedAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            return (httpContext.Request.IsLocal || base.AuthorizeCore(httpContext)));
        }
}

أو يمكنك دائما التخلي عن عنوان بعيد معين (جهازك، على سبيل المثال).

هذا هو!

تحرير: نسيت أن أذكر، سوف تستخدمها كما كنت تستخدم مرشح المؤلف

class MyController : Controller
{
    [LocalPermittedAuthorize]
    public ActionResult Fire()
    {
        Missile.Fire(Datetime.Now);
    }
}

قم بتنفيذ مزود الدور الخاص بك وتعيين تطبيقك لاستخدامه. ثم سيسمح سمة الأذن برمز أوذارك.

أرى فقط 2 طرق: تجاوز AuthorizeAttribute.OnAuthorization طريقة أو إنشاء سمة تفويض خاصة بك من الصفر.

1) سهل جدا:

public class CustomAuthorizeAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);

        /// your behavior here
    }
}

2) سهلة جدا - انظر فقط إلى مصدر ASP.NET MVC، Authorizeattribute.cs. ملف

يبدو أنه يمكنك تطبيق عامل تصفية مخصص كالمعتاد (و Whherit Authoriztribute إذا كنت تريد)، ثم قم بإنشاء ActionInvoker جديد يرث جهاز التحكم ويتجاوز jetfilters. في GetFilters، يمكنك الاتصال base.GetFilters() للحصول على قائمة المرشحات، تكررها من خلال المرخصين واستبدال المكالمات إلى AuthorizeFilter مع المكالمات إلى مرشح مخصص الخاص بك.

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

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