جلسة الوصول في ihttpmodule والقدرة على القيام بالاستجابة.
-
27-09-2019 - |
سؤال
بعد الحل الموجود في هل يمكنني الوصول إلى حالة الجلسة من httpmodule؟, ، أنا قادر على الوصول إلى حالة الجلسة من ihttpmodule. أستخدمه للتحكم في الوصول إلى بعض الملفات ، لذلك في حالة عدم الوصول إلى شخص ما ، أود إعادة توجيهها إلى صفحة تسجيل الدخول. عندما أحاول القيام httpcontext.current.response.redirect (صفحة) ؛ إنه يغلق خادم الويب لأعلى. لذا فإن منشورتي تحصل على وظيفة حالة الطلب تبدو هكذا ...
void Application_PostAcquireRequestState(object source, EventArgs e)
{
HttpApplication app = (HttpApplication)source;
MyHttpHandler resourceHttpHandler = HttpContext.Current.Handler as MyHttpHandler;
if (resourceHttpHandler != null)
{
// set the original handler back
HttpContext.Current.Handler = resourceHttpHandler.OriginalHandler;
}
HttpContext context = HttpContext.Current;
string filePath = context.Request.FilePath;
context.Trace.Write("HttpDownloadModule", "File path: " + filePath);
Boolean hasAccess = true;
if (filePath.Contains("content/downloads"))
{
//check to make sure a session has been established already....
if (context.Session == null)
hasAccess = false;
SecurityBLL security = new SecurityBLL();
string fileName = filePath.Split('/').Last();
//check to see if a user is logged in
if (!CitrixAccess.loggedin)
hasAccess = false;
//check access for download
if (!security.checkSecurityByDownload(fileName))
hasAccess = false;
if (!hasAccess)
{
HttpContext.Current.Handler = resourceHttpHandler.OriginalHandler;
HttpContext.Current.Response.Redirect("../../login.aspx");
}
}
}
أي أفكار؟ شكرا للمساعدة!
المحلول
حسنًا ، لذلك وجدت حلًا بديلًا ... لقد نقلت متغير HasAccess ليكون عالميًا وأضفت معالج EndRequest. لذلك أنا أتحقق من hasaccess في Endrequest وأقوم بإعادة التوجيه من هناك.
نصائح أخرى
إجابتي تشمل إجابة Arthurdent510 لكن ليس لدي ما يكفي من السمعة للتعليق ببساطة على إجابته هاها. ساعدني إجابته كثيرًا لمعرفة أين اضطررت للذهاب ، لكنه لم يكن مكتملًا تمامًا بالنسبة لي.
وضع الاستجابة. تسبب الدعوة في معالج EndRequest في حلقة لا حصر لها. أعتقد أن هذا يرجع إلى أن الاستجابة. لذلك تم استدعاء Endrequest مرارا وتكرارا إلى الأبد.
للتغلب على هذا ، أضفت منطقية خاصة للإشارة إلى ما إذا كنت قد اتصلت بالفعل بإعادة التوجيه. إذا اتصلت بالفعل بإعادة التوجيه ، فلن أتصل بالاستجابة. REREDIRECT مرة أخرى. هذا ما تبدو عليه طريقة endrequest الخاصة بي:
Private Sub Application_EndRequest(ByVal source As Object, ByVal e As EventArgs)
If Not _blnHasAccess AndAlso Not _blnRedirected Then
_blnRedirected = True
HttpContext.Current.Response.Redirect("~/Error.aspx")
End If
End Sub