में लॉग इन होता है तो अनधिकृत रूप से रीडायरेक्ट किया जाता है हमारे पास एक ऐसा एप्लिकेशन है जो मूल लॉगिन तंत्र प्रदान करने के लिए एएसपीनेट सदस्यता का उपयोग करता है। यह सब ठीक काम करता है, लेकिन हाल ही में हमने पाया है कि अगर आप लॉगिन पेज पर जाने का प्रयास करते हैं तो आपको 'अनधिकृत' पृष्ठ पर रीडायरेक्ट किया जाता है।एएसपी.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
(मेरा कस्टम पृष्ठ) पर रीडायरेक्ट करता है। हालांकि, मैं अब भी में लॉग इन कर रहा हूँ।
नेटवर्क
अनधिकृत पेज अनुरोध करता है। हाइलाइट किए गए पीले रंग के अनुभागों पर ध्यान दें कि मैं अभी भी लॉग इन हूं। यह केवल तब दिखाई देता है जब आप लॉग इन होते हैं। लॉग इन नहीं होने पर आपको इनमें से कोई भी नहीं मिलता है।
समस्या हो कि आवेदन क्या करना है पता नहीं है जब मैं पहले से प्रवेश और एक पृष्ठ इस पर [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
करने के लिए मुझे निर्देशित कर दिये है (के माध्यम से आगे बढ़ द्वारा सत्यापित) चलाया जाता है के बाद से।
'AuthorizeRedirect' कहां लागू किया गया है? –
अब कोड तक पहुंच नहीं है, लेकिन मुझे पूरा यकीन है कि यह मानक फ़िल्टरकॉन्फ़ में स्थापित है जैसे 'filter.add (Authorizeredirect)' –
ऐसा लगता है कि उपयोगकर्ता अनधिकृत है। क्या यह सच है? क्या आप अनधिकृत पर रीडायरेक्ट होने के बाद/होम/इंडेक्स हिट कर सकते हैं? –