7

我有一个由mythz(ServiceStack dev)建议的用于身份验证的全局请求过滤器,在这个SO Answer

我的过滤器:

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

当我请求继承动态 ViewPage的 ServiceStack Razor 页面时,过滤器不会为我触发

示例 /Default.cshtml:

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

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

有解决办法吗?我做错了什么吗?


更新

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

@using ServiceStack.ServiceInterface
@inherits ViewPage

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

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

不过,这两种解决方案似乎都是无关紧要的,而且不是很干燥。

4

2 回答 2

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));
    }
}

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

于 2013-11-12T01:06:10.087 回答
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.");
}
于 2013-02-18T17:20:30.767 回答