ServiceStack.Razor - 要求对普通cshtml文件进行身份验证

时间:2013-06-13 11:59:56

标签: servicestack

我一直在使用一种技术来保护我在ServiceStack中的普通cshtml文件(不受服务支持)。我将概述下面使用的技术。但是,最近在ServiceStack中添加了Razor 2支持已经破坏了我的实现。

原始实施

using ServiceStack.Razor;
using ServiceStack.ServiceInterface;

public class SecuredViewPage : ViewPage
{
    public override void Init(ServiceStack.Razor.Templating.IRazorViewEngine viewEngine, ServiceStack.Html.ViewDataDictionary viewData, ServiceStack.ServiceHost.IHttpRequest httpReq, ServiceStack.ServiceHost.IHttpResponse httpRes)
    {
        new AuthenticateAttribute().Execute(httpReq, httpRes, this);

        base.Init(viewEngine, viewData, httpReq, httpRes);
    }

}

然后在我的cshtml文件中,我有以下内容:

@inherits SecuredViewPage

现在的问题是,在3.9.94中,Init方法不再是 ViewPageBase 中的抽象方法。

My Questions

有没有更好的方法来实现这一目标?

我应该看看ServiceStack是否会改变实施

1 个答案:

答案 0 :(得分:3)

我已经找到了解决问题的方法。我不确定这是多么好的解决方案,但它似乎对我有用。

我基本上从Servicestack源复制了ViewPage.cs,并将我的身份验证检查放在那里。

public class SecuredViewPage : ViewPageBase<dynamic>, IRazorView
{
    public HtmlHelper Html = new HtmlHelper();

    public override Type ModelType
    {
        get
        {
            return typeof(DynamicRequestObject);
        }
    }

    public void Init(IViewEngine viewEngine, IHttpRequest httpReq, IHttpResponse httpRes)
    {
        base.Request = httpReq;
        base.Response = httpRes;

        new AuthenticateAttribute().Execute(Request, Response, this);

        Html.Init(viewEngine: viewEngine, httpReq: httpReq, httpRes: httpRes, razorPage: this);
    }

    public override void SetModel(object o)
    {
        base.SetModel(o);
        Html.SetModel(o);
    }

    public void WriteTo(StreamWriter writer)
    {
        this.Output = Html.Writer = writer;
        this.Execute();
        this.Output.Flush();
    }

    public override void Execute()
    {
    }
}