2008-10-08 21 views
7

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

उत्तर

3

मामले में आप FormsAuthentication, जब ASP.NET प्रवेश पृष्ठ पर एक रीडायरेक्ट का उपयोग कर रहे है, URL कुछ ऐसा दिखता है:

http://www.mysite.com/Login?ReturnUrl=/Something 

लॉगिन फ़ॉर्म की एक्शन विशेषता में वही रिटर्न यूआरएल पैरामीटर होना चाहिए (या तो छुपा इनपुट या यूआरएल के हिस्से के रूप में) ताकि फॉर्म प्रमाणीकरण इसे उठा सके और रीडायरेक्ट कर सके, उदाहरण के लिए

<form action="Login?ReturnUrl=<%=Html.AttributeEncode(Request.QueryString["ReturnUrl"]) %>"></form> 

या

<form><input type="hidden" name="ReturnUrl" id="ReturnUrl" value="<%=Html.AttributeEncode(Request.QueryString["ReturnUrl"])"%> /></form> 
2

जो परिणाम मैंने प्राप्त करने के लिए किया वह शायद अधिक हो सकता है, और मैं कुछ अन्य तरीकों को भी देखना चाहता हूं। हालांकि, मेरा कोड यहाँ है।

कृपया ध्यान दें कि यह संदर्भ के लिए मॉक का उपयोग कर रहा है ... और, मैंने अभी तक क्वेरीस्ट्रिंग के साथ कुछ भी नहीं किया है (मेरे मार्गों में कोई क्वेरीस्ट्रिंग नहीं है)।

var urlReferrer = Request.UrlReferrer; 
if (urlReferrer != null) 
{ 
    var url = "~" + Server.UrlDecode(urlReferrer.PathAndQuery); 

    // get routecollection 
    var routeCollection = new RouteCollection(); 
    GlobalApplication.RegisterRoutes(routeCollection); 

    // mcok context 
    var context = new Mock<HttpContextBase>(); 
    var request = new Mock<HttpRequestBase>(); 
    context.Expect(ctx => ctx.Request).Returns(request.Object); 

    // mock request 
    // TODO: convert querystring to namevaluecollection 
    // now it's just stripped 
    if (url.IndexOf('?') > 0) 
    { 
     url = url.Substring(0, url.IndexOf('?')); 
    } 

    var mock = Mock.Get(context.Object.Request); 

    // TODO: insert namevaluecollection of querystring 
    mock.Expect(req => req.QueryString).Returns(new NameValueCollection()); 
    mock.Expect(req => req.AppRelativeCurrentExecutionFilePath).Returns(url); 
    mock.Expect(req => req.PathInfo).Returns(string.Empty); 

    // get routedata with mocked context 
    var routeData = routeCollection.GetRouteData(context.Object); 
    var values = routeData.Values; 

    return RedirectToAction(routeData.Values["action"].ToString(), values); 
} 

जैसा कि मैंने कहा, यह हो सकता है थोड़ा overcomplicated :)

+0

बस एक अतिरिक्त टिप्पणी के रूप में, मैं कुछ रूटडेटा के मानों को संशोधित करने के लिए ऊपर दिए गए कोड का भी उपयोग करता हूं। – Casper

0

तुम हमेशा सुनिश्चित करना चाहिए कि संदर्भ देने वाला URL अपने डोमेन और एक सुखद स्ट्रिंग है कि वे से आ रहा है के भीतर है। अन्यथा इसमें फ्लैश या अन्य क्लाइंट साइड टेक्नोलॉजीज के साथ प्रतिक्रिया विभाजन या अन्य हमलों, ज्ञात और अज्ञात जैसी चीजों को करने की क्षमता है।

HTTP रेफरर उपयोगकर्ता इनपुट है, और इसे किसी अन्य की तरह सत्यापित किया जाना चाहिए।

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