ServiceStack全局请求筛选器未触发

时间:2013-01-13 15:07:34

标签: servicestack

我有mythz(ServiceStack dev)建议的全局请求过滤器,在SO Answer

我的过滤器:

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

当我请求继承dynamic ViewPage

的ServiceStack Razor页面时,过滤器不会为我开火

示例/Default.cshtml:

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

answer的底部,在评论中,提问者提出类似的行为,但没有准确描述如何重现,所以我看不到解决方案。

有解决方案吗?我做错了吗?


更新

我发现我可以直接在页面上声明属性:

@using ServiceStack.ServiceInterface
@inherits ViewPage

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

或者我确信我可以创建一个继承ViewPage的类并在其Init方法中运行它们并在Razor页面上使用新类。

但这两种解决方案看起来都是无关紧要的,而且不是很干燥。

2 个答案:

答案 0 :(得分: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));
    }
}

我确保只有顶级页面继承此内容,而不是将其应用于局部页面,因此过滤器只会触发一次。

答案 1 :(得分: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.");
}