2013-01-13 13 views
7

मैं के रूप में mythz (ServiceStack देव) ने सुझाव दिया प्रमाणीकरण के लिए एक वैश्विक अनुरोध फिल्टर है, में इस SO AnswerServiceStack वैश्विक अनुरोध फ़िल्टर फायरिंग नहीं

मेरे फिल्टर:

RequestFilters.Add((httpReq, httpResp, requestDto) => 
{ 
    if (!PublicRoutes.Contains(httpReq.PathInfo)) 
    { 
     new AuthenticateAttribute().Execute(httpReq, httpResp, requestDto); 
    } 
}); 

फिल्टर मेरे लिए आग नहीं करता है मैं ServiceStack उस्तरा पृष्ठों कि dynamic ViewPage

उदाहरण /Default.cshtml वारिस का अनुरोध करते हैं:

@inherits ViewPage 
<!DOCTYPE html> 
<html> 
    <head> 
     <title>HOME</title> 
... 
... 
ETC 

टिप्पणियों में answer के नीचे नीचे, प्रश्न raiser समान व्यवहार का सुझाव देता है, लेकिन सटीक रूप से वर्णन नहीं करता है कि पुन: उत्पन्न करने के लिए, इसलिए मुझे कोई समाधान नहीं दिखाई दे रहा है।

क्या कोई समाधान है? क्या मैंने कुछ गलत किया?


अद्यतन

मैं मैं सीधे अपने पन्ने पर गुण घोषणा कर सकते हैं की खोज की है:

@using ServiceStack.ServiceInterface 
@inherits ViewPage 

@{ 
    new AuthenticateAttribute().Execute(Request, Response, this); 
} 
<!DOCTYPE html> 
... 
... 
ETC 

या मुझे यकीन है कि मैं एक वर्ग ViewPage वारिस बना सकते हैं और उन में चला सकते हैं कर रहा हूँ इसकी Init विधि और रेजर पृष्ठों पर नई कक्षा का उपयोग करें।

उन दोनों समाधानों में अपरिपक्व लग रहा है और बहुत शुष्क नहीं है, हालांकि।

उत्तर

1

मैं अपने ही बना दी में लॉग ऑन है: पहले एक खाली डीटीओ कि कुछ नहीं करता है ViewPage वर्ग इस लक्ष्य को हासिल करने के लिए और फिल्टर लागू करने के बाद मॉडल पृष्ठ पर सेट कर दिया गया है

public abstract class FilterViewPage<TModel> : ViewPage<TModel> 
    where TModel : class 
{ 
    public override void SetModel(object o) 
    { 
     base.SetModel(o); 

     this.AppHost.RequestFilters.ForEach(action => action.Invoke(this.Request, this.Response, this.Model)); 
     this.AppHost.ResponseFilters.ForEach(action => action.Invoke(this.Request, this.Response, this.Model)); 
    } 
} 

मैं यह सुनिश्चित केवल शीर्ष स्तर के पृष्ठों इस वारिस, बल्कि आंशिक करने के लिए इसे लागू करने से तो फिल्टर केवल एक बार आग लगती है।

0

ठीक है, अगर कोई लॉग इन किया गया है तो बस यह जांचने के अलावा, भूमिकाओं के आधार पर अधिकांश भूमिकाएं आपके लिए डीटीओ अनुरोध पर आधारित हैं। आप जो कर रहे हैं उसके लिए कुछ विकल्प हैं।

[Route("/")] 
[Authenticate] 
public class Default { } 

public class DefaultService : Service 
{ 
    public object Get(Default req) 
    { 
     return new object(); 
    } 
} 

दूसरा एक सरल जांच है यदि कोई उपयोगकर्ता उस्तरा पेज

@{ 
    var session = Cache.SessionAs<AuthUserSession>(); 
    if (!session.IsAuthenticated) throw new HttpException(403, "You are not logged in."); 
} 
संबंधित मुद्दे