2008-08-29 12 views
6

मैं ip6 पर तैनाती asp.net-mvc का उपयोग कर एक ऐप लिख रहा हूं। मैं प्रपत्र प्रमाणीकरण का उपयोग कर रहा हूँ। आमतौर पर जब कोई उपयोगकर्ता उचित प्राधिकरण के बिना संसाधन तक पहुंचने का प्रयास करता है, तो मैं चाहता हूं कि उन्हें लॉगिन पृष्ठ पर रीडायरेक्ट किया जाए। FormsAuth मेरे लिए यह काफी आसान है।बायपास फॉर्म प्रमाणीकरण स्वत: रीडायरेक्ट लॉगिन करने के लिए, कैसे करें?

समस्या: अब मेरे पास एक कंसोल ऐप द्वारा एक क्रिया का उपयोग किया जा रहा है। लॉग इन पेज पर अनुरोध को पुनर्निर्देशित करने के बजाय इस कार्रवाई को करने का सबसे तेज़ तरीका क्या है w/स्थिति 401?

मैं चाहता हूं कि कंसोल ऐप पारदर्शी होने के बजाय इस 401 स्टेटसोड पर प्रतिक्रिया करने में सक्षम हो। मैं डिफॉल्ट रखना भी चाहूंगा, पेज व्यवहार को लॉगिन करने के लिए अनधिकृत अनुरोधों को पुनर्निर्देशित करना चाहूंगा।

नोट: एक परीक्षण के रूप में मैं अपने Global.asax को यह जोड़ा गया है और यह नहीं बाईपास रूपों प्रमाणन किया:

protected void Application_AuthenticateRequest(object sender, EventArgs e) 
{ 
    HttpContext.Current.SkipAuthorization = true; 
} 

@Dale और एंडी

मैं AuthorizeAttributeFilter उपयोग कर रहा हूँ एमवीसी पूर्वावलोकन 4 में प्रदान किया गया। यह एक HttpUnauthorizedResult लौट रहा है। यह परिणाम स्थिति कोड को 401 पर सही ढंग से सेट कर रहा है। समस्या, जैसा कि मैं इसे समझता हूं, यह है कि एएसपीनेट प्रतिक्रिया को रोक रहा है (क्योंकि यह 401 के रूप में टेज किया गया है) और इसे लॉग इन पेज पर रीडायरेक्ट करने के बजाय इसे जाने के बजाए। मैं कुछ यूआरएल के लिए इस अवरोध को बाईपास करना चाहता हूं।

+1

देखें http://stackoverflow.com/questions/2839406/forms-authentication-disable-redirect-to-the-login-page –

उत्तर

5

ठीक है, मैंने इसके आसपास काम किया। मैंने कस्टम एक्शन रिसेट (एचटीपीफ़ोरबिडन रीसेट) और कस्टम एक्शनफिल्टर (नोफॉलबैकअधिकृत) बनाया है।

पुनर्निर्देशन से बचने के लिए, HttpForbiddenResult स्टेटस कोड 403 के साथ प्रतिक्रियाओं को चिह्नित करता है। फॉर्म प्रमाणीकरण इस कोड के साथ प्रतिक्रिया नहीं पकड़ता है, इसलिए लॉगिन पुनर्निर्देशन प्रभावी ढंग से छोड़ दिया जाता है। NoFallBack फ़िल्टर चेक को प्राधिकृत करने के लिए यह देखने के लिए कि उपयोगकर्ता को अधिकृत, फ़िल्टर, अधिकृत फ़िल्टर की तरह अधिकृत किया गया है या नहीं। यह अलग है कि जब यह अस्वीकार कर दिया जाता है तो यह HttpForbiddenResult देता है।

HttpForbiddenResult बहुत तुच्छ है:

 
public class HttpForbiddenResult : ActionResult 
{ 
    public override void ExecuteResult(ControllerContext context) 
    { 
     if (context == null) 
     { 
      throw new ArgumentNullException("context"); 
     } 
     context.HttpContext.Response.StatusCode = 0x193; // 403 
    } 
} 

यह FormsAuthenticationModule में प्रवेश पृष्ठ पुनर्निर्देशन को छोड़ने के लिए संभव हो सकता है प्रतीत नहीं होता है।

+0

मैंने वही किया। इस लड़के को लगता है कि वैसे भी करना सही बात है: http://danielirvine.com/blog/2011/07/18/understanding-403-forbidden –

-1

मैं कुछ Googling किया था और यह है कि क्या मैं के साथ आया है:


    HttpContext.Current.Response.StatusCode = 401; 

सुनिश्चित नहीं हैं कि अगर यह काम करता है या नहीं, मैं यह परीक्षण नहीं किया। किसी भी तरह से, यह एक कोशिश के लायक है, है ना? :)

0

क्या आपने कार्रवाई के लिए अपना खुद का फॉर्मअथ विशेषता लिखा था? यदि ऐसा है, तो OnActionExecuting विधि में, आप FilterExecutingContext को पारित कर देते हैं। आप 401 कोड को वापस करने के लिए इसका उपयोग कर सकते हैं।

public class FormsAuth : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(FilterExecutingContext filterContext) 
    { 
     filterContext.HttpContext.Response.StatusCode = 401; 
     filterContext.Cancel = true; 
    } 
} 

यह काम करना चाहिए। मुझे यकीन नहीं है कि क्या आपने FormsAuth विशेषता लिखा है या यदि आपको इसे कहीं और से मिला है।

0

मैंने अभी तक पूर्वावलोकन 4 में आने वाले AuthorizeAttribute का उपयोग नहीं किया है। मैंने अपना खुद का लुढ़काया, क्योंकि मैं पहले सीटीपी के बाद से एमवीसी फ्रेमवर्क का उपयोग कर रहा हूं। मैंने परावर्तक में विशेषता पर एक त्वरित नज़र डाली और यह मैंने आंतरिक रूप से ऊपर वर्णित किया है, सिवाय इसके कि वे 401 के हेक्स समकक्ष का उपयोग करते हैं। मुझे यह देखने के लिए कॉल अप और आगे देखना होगा, अपवाद पकड़ा गया है, क्योंकि अधिक से अधिक संभावना है कि वे रीडायरेक्ट कर रहे हैं। यह वह कार्यक्षमता है जिसे आपको ओवरराइड करने की आवश्यकता होगी। मुझे यकीन नहीं है कि आप इसे अभी तक कर सकते हैं, लेकिन जब मैं इसे पाता हूं और आपको एक काम देता हूं, तब तक मैं वापस पोस्ट करूंगा, जब तक हैकड इसे देख न ले और इसे स्वयं पोस्ट न करे।

1

एक क्लज (और यहां तक ​​कि काम भी नहीं कर सकता) हो सकता है लेकिन आपके लॉगिन पेज पर देखें कि Request.QueryString["ReturnUrl"] != null और यदि ऐसा है तो Response.StatusCode = 401 सेट करें।

ध्यान रखें कि आपको अभी भी अपने कंसोल ऐप को किसी भी तरह प्रमाणित करने की आवश्यकता होगी। आपको HTTP मूलभूत लेख मुफ्त में नहीं मिलता है: आपको अपना खुद का रोल करना होगा, लेकिन इसके बारे में बहुत सारे कार्यान्वयन हैं।

+0

यह दडिनो द्वारा उल्लिखित कारणों की सहायता नहीं करता है। –

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