10

में लॉग इन होता है तो अनधिकृत रूप से रीडायरेक्ट किया जाता है हमारे पास एक ऐसा एप्लिकेशन है जो मूल लॉगिन तंत्र प्रदान करने के लिए एएसपीनेट सदस्यता का उपयोग करता है। यह सब ठीक काम करता है, लेकिन हाल ही में हमने पाया है कि अगर आप लॉगिन पेज पर जाने का प्रयास करते हैं तो आपको 'अनधिकृत' पृष्ठ पर रीडायरेक्ट किया जाता है।एएसपी.NET सदस्यता लॉगिन जब उपयोगकर्ता

उदाहरण उपयोगकर्ता प्रवाह।

उपयोगकर्ता सुरक्षित पृष्ठ पर जाता है (पूरे एप्लिकेशन को लॉगिन की आवश्यकता होती है, भी एक होम पेज नहीं है जिसे आप देख सकते हैं, बस सीधे लॉगिन करने के लिए रीडायरेक्ट करता है)। यह उन्हें https://www.example.com/Account/Login पर रीडायरेक्ट करता है।

उपयोगकर्ता लॉग इन करता है और होम पेज https://www.example.com/ पर रीडायरेक्ट किया जाता है। वे लॉग इन हैं और सब कुछ ठीक काम करता है।

उपयोगकर्ता एक बुकमार्क कि करने के लिए https://www.example.com/Account/Login

उपयोगकर्ता सामान्य अनधिकृत पृष्ठ पर पुनः निर्देशित किया गया है स्थापित किया जाना होता है क्लिक करता है।

मैं अपने AccountController पर <Authorize()> विशेषता लेकिन 'लॉग इन' कार्रवाई पर <AllowAnonymous()> विशेषता, जैसा कि हम पहले देखा था जो ठीक काम करता है जब आप लॉग इन नहीं हैं, लेकिन जब आप कर रहे हैं यह एक में प्राप्त करने के लिए लगता है एक गड़बड़ी का थोड़ा सा।

AccountController

<Authorize()> _ 
Public Class AccountController 
'''other functions go here''' 

<AllowAnonymous()> _ 
Public Function Login(ByVal returnUrl As String) As ActionResult 
    ViewData("ReturnUrl") = returnUrl 
    Return View() 
End Function 

AuthorizeRedirect फिल्टर

<AttributeUsage(AttributeTargets.[Class] Or AttributeTargets.Method)> _ 
Public Class AuthorizeRedirect 
    Inherits AuthorizeAttribute 
    Private Const IS_AUTHORIZED As String = "isAuthorized" 

    Public RedirectUrl As String = "~/Home/Unauthorized" 

    Protected Overrides Function AuthorizeCore(httpContext As System.Web.HttpContextBase) As Boolean 
     Dim isAuthorized As Boolean = MyBase.AuthorizeCore(httpContext) 

     httpContext.Items.Add(IS_AUTHORIZED, isAuthorized) 

     Return isAuthorized 
    End Function 

    Public Overrides Sub OnAuthorization(filterContext As AuthorizationContext) 
     MyBase.OnAuthorization(filterContext) 

     Dim isAuthorized = If(filterContext.HttpContext.Items(IS_AUTHORIZED) IsNot Nothing, Convert.ToBoolean(filterContext.HttpContext.Items(IS_AUTHORIZED)), False) 

     If Not isAuthorized AndAlso filterContext.RequestContext.HttpContext.User.Identity.IsAuthenticated Then 
      filterContext.RequestContext.HttpContext.Response.Redirect(RedirectUrl) 
     End If 
    End Sub 
End Class 

यह सब देखकर मुझे लगा कि सबसे सरल समाधान की जाँच करने के हो सकता है अगर उपयोगकर्ता पहले से ही मेरे लॉग कार्रवाई पर में लॉग ऑन है और अनुप्रेषित उन्हें खुद दूर, इस तरह कुछ।

<AllowAnonymous()> _ 
Public Function Login(ByVal returnUrl As String) As ActionResult 
    If User.Identity.IsAuthenticated() Then 
     Return RedirectToAction("Index", "Home") 
    End If 
    ViewData("ReturnUrl") = returnUrl 
    Return View() 
End Function 

लेकिन AuthorizeFilter हमेशा पहले जिस तरह से है, जो समझा जा सकता है में कूदता है, लेकिन मैं काफी पिछले गायब टुकड़ा को समझ नहीं सकता। मैं चाहता हूं कि यह लॉग इन होने पर उपयोगकर्ता लॉगिन स्क्रीन पर जाता है, और उन्हें होम पेज पर रीडायरेक्ट करने के लिए 'आपको इस पृष्ठ को देखने की अनुमति नहीं है' दिखाएं। मैं क्या खो रहा हूँ? चीज़ें थोड़ी साफ

जब पहले से लॉग इन, मैं /Account/Login करने के लिए जाना बनाने के लिए


संपादित करें। यह 302 मुझे /Home/Unauthorized (मेरा कस्टम पृष्ठ) पर रीडायरेक्ट करता है। हालांकि, मैं अब भी में लॉग इन कर रहा हूँ।

नेटवर्क

Network request to Login page, which 302 redirects to Unauthorized

अनधिकृत पेज अनुरोध करता है। हाइलाइट किए गए पीले रंग के अनुभागों पर ध्यान दें कि मैं अभी भी लॉग इन हूं। यह केवल तब दिखाई देता है जब आप लॉग इन होते हैं। लॉग इन नहीं होने पर आपको इनमें से कोई भी नहीं मिलता है।

Unauthorized page

समस्या हो कि आवेदन क्या करना है पता नहीं है जब मैं पहले से प्रवेश और एक पृष्ठ इस पर [AllowAnonymous] विशेषता है कि करने के लिए जाने के लिए कोशिश कर रहा हूँ लगता है। यदि कुछ भी हो, तो मैं जिस व्यवहार को देख रहा हूं वह वास्तव में मुझे एक लॉगिन पृष्ठ दे रहा है, क्योंकि यह भ्रमित होगा, लेकिन फिर भी, यह आदर्श नहीं है।


संपादित करें 2 - लाइन

यहाँ से कोड लाइन के माध्यम से कदम लाइन द्वारा कोड लाइन के माध्यम से कदम के परिणाम हैं।

पृष्ठ /Account/Login जबकि AuthorizeRedirect फिल्टर में OnAuthorization उप में लॉग इन किया।

पहले ब्रेकप्वाइंट।

Public Overrides Sub OnAuthorization(filterContext As AuthorizationContext) 
    MyBase.OnAuthorization(filterContext) 

    Dim isAuthorized = If(filterContext.HttpContext.Items(IS_AUTHORIZED) IsNot Nothing, Convert.ToBoolean(filterContext.HttpContext.Items(IS_AUTHORIZED)), False) 

    If Not isAuthorized AndAlso filterContext.RequestContext.HttpContext.User.Identity.IsAuthenticated Then 
     filterContext.RequestContext.HttpContext.Response.Redirect(RedirectUrl) 
    End If 
End Sub 

Dim isAuthorized से शुरू होने वाली रेखा झूठी रिटर्न देता है। filterContext.HttpContext.Items(IS_AUTHORIZED) कुछ भी नहीं है (वस्तुओं की सूची में मौजूद नहीं है)।

इसका मतलब है कि अगला अगर कथन सत्य पर मूल्यांकन करता है (नहीं अधिकृत है और भी ... IsAuthenticated), जिसके परिणामस्वरूप रीडायरेक्ट RedirectUrl पर होता है।

ऐसा होने के बाद यह एक ही कदम पर वापस जाने लगता है, इस बार यह झूठ का मूल्यांकन करता है, जिसका अर्थ यह है कि रीडायरेक्ट नहीं होता है, हालांकि मुझे लगता है कि यह केवल 'अनधिकृत' पृष्ठ लोड हो रहा है और चल रहा है एक ही कोड फिर से।

मैंने AccountController के Login फ़ंक्शन के शीर्ष पर निम्न ब्लॉक जोड़ने का प्रयास किया।

If User.Identity.IsAuthenticated() Then 
     Return RedirectToAction("Index", "Home") 
    End If 

लेकिन, बेशक, फिल्टर कार्यों घटित होने से पहले इस कोड को मारा नहीं है जब तक के बाद यह पहले से ही Unauthorized करने के लिए मुझे निर्देशित कर दिये है (के माध्यम से आगे बढ़ द्वारा सत्यापित) चलाया जाता है के बाद से।

+0

'AuthorizeRedirect' कहां लागू किया गया है? –

+0

अब कोड तक पहुंच नहीं है, लेकिन मुझे पूरा यकीन है कि यह मानक फ़िल्टरकॉन्फ़ में स्थापित है जैसे 'filter.add (Authorizeredirect)' –

+0

ऐसा लगता है कि उपयोगकर्ता अनधिकृत है। क्या यह सच है? क्या आप अनधिकृत पर रीडायरेक्ट होने के बाद/होम/इंडेक्स हिट कर सकते हैं? –

उत्तर

2
AuthorizationAttribute के लिए

आधार वर्ग अपने OnAuthorization विधि में इस कोड है: अगर नियंत्रक कार्रवाई एक AllowAnonymousAttribute इस पर परिभाषित है

bool skipAuthorization = filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit: true) 
         || filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit: true); 

if (skipAuthorization) 
{ 
    return; 
} 

if (AuthorizeCore(filterContext.HttpContext)) 
// ... 

जैसे, अपने AuthorizeCore विधि कहा जाता है नहीं किया जाएगा।

उस filterContext.HttpContext.Items(IS_AUTHORIZED) की वजह से कभी भी सेट नहीं होगा।

बेस क्लास को कॉल किए बिना OnAuthorization को लागू करने के लिए आप बस here से कोड कॉपी कर सकते हैं। इस तरह आप कैशिंग के साथ सौदा कर सकते हैं जिस तरह से आप चाहते हैं।

संयोग से, मैं इस धारणा के तहत था कि अगर प्राधिकरण विफल हुआ कि अनुरोध पाइपलाइन में बाद की प्रक्रिया ने लॉगिन पेज पर रीडायरेक्ट किया था। यही कारण है कि OnAuthorization का आधार कार्यान्वयन filterContext.Result को एक नए HttpUnauthorizedResult उदाहरण पर सेट करता है। तो यह पूरी तरह से स्पष्ट नहीं है कि आप OnAuthorization ओवरराइड क्यों कर रहे हैं और रीडायरेक्ट को पहले स्थान पर कर रहे हैं।यदि आप किसी प्रकार का कस्टम प्राधिकरण कोड true या falseAuthorizeCore से वापस लौटना चाहते हैं तो पर्याप्त होना चाहिए।

संबंधित मुद्दे