我有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页面上使用新类。
但这两种解决方案看起来都是无关紧要的,而且不是很干燥。
答案 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.");
}