1

我一直在使用一种技术来保护 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 是否会改变实现

4

1 回答 1

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()
    {
    }
}
于 2013-06-17T13:47:16.643 回答