تحديد ما إذا كان المستخدم يمكنه الوصول إلى الصفحة المطلوبة؟

StackOverflow https://stackoverflow.com/questions/1048492

  •  20-08-2019
  •  | 
  •  

سؤال

لدي موقع ويب ASP.NET له أدوار متعددة ، ولكل منها إمكانية الوصول إلى دليل منفصل (يمكن لمستخدمي المسؤولين الوصول /المسؤول ، يمكن للمتسوقين الوصول /التسوق وما إلى ذلك) ، باستخدام صفحة تسجيل دخول مشتركة. إذا قام شخص ما بزيارة صفحة تسجيل الدخول مع عنوان عنوان URL لإرجاع إلى دليل لا يمكنه الوصول إليه (على سبيل المثال زيارات المتسوق/login.aspx؟returnurl=/admin/index.aspx) ، يمكن للمستخدم أصالة بنجاح (بيانات اعتماد تسجيل الدخول هي صالح) ، لكنهم ينتهي بهم المطاف في صفحة تسجيل الدخول (لا يمكنهم الوصول إلى الصفحة التي طلبوها).

كيف يمكنني التقاط هذا ، حتى أتمكن من عرض رسالة هل المستخدم؟

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

المحلول 2

انتهى بي الأمر إلى القيام بذلك في حدث page_load من صفحة تسجيل الدخول:

if (User.Identity.IsAuthenticated)
{
    LoginErrorDetails.Text = "You are not authorized to view the requested page";
}

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

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

نصائح أخرى

UrlAuthorizationModule.CheckUrlAccessForPrincipal()

هو ما تحتاج إلى استخدامه لاختبار وصول المستخدم إلى موقع (صفحة أو مجلد) ( http://msdn.microsoft.com/en-us/library/system.web.security.urlauthorizationModule.CheckurlAccessForPrincipal.aspx )

تتمثل إحدى الأساليب في تجاوز onload من نماذج ASPX الخاصة بك والتحقق مما إذا كان المستخدم المصادق عليه السماح بالوصول إلى المورد بناءً على الدور. لذلك يمكنك إنشاء basepage.cs (التي تحدد فيها قاعدة فئة ترث من system.web.ui.page) على سبيل المثال والتي ترثها جميع أشكالك (ASPX) ، والتي تقوم بها:

protected override void OnLoad(EventArgs e)
{
    InitializeSitemap();
    if (SiteMap.CurrentNode != null)
    {
        if (!UrlHelper.IsAnonymousAllowed(SiteMap.CurrentNode) && (!HttpContext.Current.User.Identity.IsAuthenticated || !UrlHelper.IsAccesible(SiteMap.CurrentNode)))
        {
            // You can redirect here to some form that has a custom message
            Response.Redirect("~/Forms/Logout.aspx");

            return;
        }
    }
    base.OnLoad(e);
}

ثم في فئة urlhelper الخاصة بك ، تحتاج إلى وظيفة يمكن استخدامها أعلاه:

public static bool IsAccesible(SiteMapNode node)
{
    bool toRole = false;

    foreach (string role in node.Roles)
    {
        if (role == "*" || HttpContext.Current.User.IsInRole(role))
        {
            toRole = true;
        }
    }

    return toRole;
}

هنا هو isanonymoused في حال تساءلت:

public static bool IsAnonymousAllowed(SiteMapNode node)
{
    return node[AllowAnonymousAttribute] != null ? bool.Parse(node[AllowAnonymousAttribute]) : false;
}

إذا كان لديك دلائل مختلفة وكنت تستخدم مصادقة ASP.NET ، فهذا أمر سهل للغاية. كل ما تحتاجه هو وضع ملف web.config في كل دليل وتحديد الأدوار التي يمكنها الوصول إلى الملفات في هذا الدليل مثل هذا:

<authorization>
    <allow roles="shoppers"/>
    <deny  users="?"/>
</authorization>

يمكنك الحصول على مزيد من التفاصيل من هذه مقال عن MSDN

يمكنك ضبط كل شيء في web.config الرئيسي مثل هذا:

    <!-- Configuration for the "sub1" subdirectory. -->
      <location path="sub1">
        <system.web>
          <httpHandlers>
            <add verb="*" path="sub1" type="Type1"/>
            <add verb="*" path="sub1" type="Type2"/>
          </httpHandlers>
        </system.web>
      </location>

      <!-- Configuration for the "sub1/sub2" subdirectory. -->
      <location path="sub1/sub2">
        <system.web>
          <httpHandlers>
            <add verb="*" path="sub1/sub2" type="Type3"/>
            <add verb="*" path="sub1/sub2" type="Type4"/>
          </httpHandlers>
        </system.web>
      </location>
    </configuration>

هذا من هذه مقال على MSDN :)

تعديل:

في طريقة تحميل صفحتك ، قم بذلك:

if(!User.IsInRole("shopper"))
{
    lblNoAccess.Visible=true;
    lnkHome.Url="PATH_TO_HOME_PAGE_OF_THIS_ROLS";
}

آمل أن يساعدك هذا!

يمكنك إعادة توجيهه على صفحة الفهرس ، وإخباره أنه لا يستطيع الوصول إلى تلك الصفحة ؛)

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

تحرير: ربما يمكنك القيام بإعادة التوجيه في حدث تسجيل الدخول من السيطرة.

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

لذلك يمكنك أن تفعل:

if(!User.IsInRole("shopper"))
{
    session("denied") = "You don't have access to shop";
    response.redirect("/login");
}

ثم في صفحة تسجيل الدخول:

if ( session("denied") != "" ) {
   message.text = session("denied");
   session("denied") = "";
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top