2013-01-13 76 views
7

我有一個驗證的全局請求過濾器由mythz(ServiceStack DEV)的建議,在此SO AnswerServiceStack全局請求過濾器不點火

我的過濾器:

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

過濾不火對我來說當我請求繼承dynamic ViewPage

例/Default.cshtml ServiceStack剃刀的網頁:

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

在註釋answer的底部,提問者提出了類似的行爲,但沒有準確描述如何重現,所以我看不到解決方案。

有沒有解決方案?我做錯了什麼嗎?


UPDATE

我發現我可以在我的網頁上直接申報屬性:

@using ServiceStack.ServiceInterface 
@inherits ViewPage 

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

或者,我敢肯定,我可以創建一個類繼承的ViewPage和運行它們其Init方法並在Razor頁面上使用新類。

雖然這兩種解決方案看起來都是無關緊要的,並不是非常乾燥。

回答

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

那麼,除了簡單地檢查是否有人登錄之外,基於角色的許多東西都是根據請求DTO上的屬性處理的。對於你正在做的事情,有幾個選擇。首先是有一個空的DTO是不會做任何事情:

[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."); 
}