如何在.NET / PHP应用程序中限制对WordPress内容的访问

时间:2014-08-19 11:36:11

标签: c# php .net wordpress httphandler

我有一个小型期刊的WordPress网站。它托管在Azure VM上的IIS中,并使用MSSQL而不是MySQL。虽然大部分内容都是免费提供的,但我想限制只向付费订阅者访问更新的内容。我想知道如何做到这一点。我正在考虑为每个Post / Article的slug添加一些简单的代码(也许只是让slug以' protected - '开头)。然后,我可以编写一个C#.NET HttpHandler来检查Uri是否有'受保护的'代码,检查用户是否可以通过数据库中的条目访问它,并允许或不允许访问。这种方法有用吗?任何其他可能性。

请注意,我不是PHP开发人员,任何解决方案都需要使用.NET实现。

编辑200814

我使用HttpModule查看了任何传入请求,取得了一些进展。这是通过将相关行添加到Web.config:

来实现的

内部

<modules runAllManagedModulesForAllRequests="true">
    <add name="WpContentAccess" type="WpJournalHttpHandler.ContentAccessModule, WpJournalHttpHandler, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ced90a15f96f61ed" preCondition="managedHandler" />
</modules>

内部

<httpModules>
  <add name="WpContentAccess" type="System.ServiceModel.Activation.HttpModule"/>
</httpModules>
<compilation targetFramework="4.0">
    <assemblies>
        <add assembly="WpJournalHttpHandler, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ced90a15f96f61ed" />
    </assemblies>
</compilation>

其中WpJournalHttpHandler是我的自定义HttpModule。

我希望在用户尝试查看包含&#39; protected&#39;的帖子/文章时重定向,例如https://journal.emergentpublications.com/article/protected_eco_010101/

但是,WP使用URL重写,因此我的HttpModule永远不会收到原始URL进行处理。我是否需要在URL重写之前运行HttpModule?

这是我的web.config中的重写条目:

<rewrite>
  <rules>
        <rule name="wordpress" patternSyntax="Wildcard">
            <match url="*" />
                <conditions>
                    <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                    <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
                </conditions>
            <action type="Rewrite" url="index.php" />
        </rule></rules>
</rewrite>

编辑200814_2

将我的Web.config的重写部分更改为:

<rewrite>
    <rules>
        <rule name="WordPress Rule" stopProcessing="true">
            <match url=".*" />
            <conditions>
                <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
            </conditions>
            <action type="Rewrite" url="index.php?page_id={R:0}" />
        </rule>
    </rules>
</rewrite>

让我的HttpModule检查context.Request.Url.ToString()。包含(&#34; protected&#34;)作为AuthenticateRequest事件的一部分我现在可以根据需要过滤WP请求。

2 个答案:

答案 0 :(得分:0)

看看付费会员专业版,它应该可以完成你想要的,而无需编写任何代码。

http://www.paidmembershipspro.com/

注意:我并不想卖给你什么,我只是他们产品的粉丝,并且已经在几个wordpress实现中使用它。

答案 1 :(得分:0)

添加C#.NET HttpModule最终工作。 IIS托管的WordPress站点的完整web.config是:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <httpErrors errorMode="Detailed" />
        <validation validateIntegratedModeConfiguration="false" />
        <modules runAllManagedModulesForAllRequests="true">
            <add name="WpContentAccess" type="WpJournalHttpHandler.ContentAccessModule, WpJournalHttpHandler, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ced90a15f96f61ed" preCondition="managedHandler" />
        </modules>
        <rewrite>
      <rules>
            <rule name="wordpress" stopProcessing="true">
                <match url=".*" />
                    <conditions>
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
                    </conditions>
                <action type="Rewrite" url="index.php?page_id={R:0}" />
            </rule></rules>
    </rewrite>
  </system.webServer>
  <system.web>
    <customErrors mode="Off" />
        <httpModules>
      <add name="WpContentAccess" type="System.ServiceModel.Activation.HttpModule" />
    </httpModules>
        <compilation targetFramework="4.0">
            <assemblies>
                <add assembly="WpJournalHttpHandler, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ced90a15f96f61ed" />
            </assemblies>
        </compilation>
  </system.web>
</configuration>

我的ContentAccessModule的框架代码是:

using System;
using System.Web;
using System.Diagnostics;

namespace WpJournalHttpHandler
{
    public class ContentAccessModule : IHttpModule
    {
        private EventLog eventLog;

        public void Init(HttpApplication application)
        {
            application.AuthenticateRequest += Application_AuthenticateRequest;


            if (!EventLog.SourceExists("WpJournal"))
            {
                EventLog.CreateEventSource("WpJournal", "WpJournalActivity");
            }
            eventLog = new EventLog {Source = "WpJournal"};
            eventLog.WriteEntry("Application initialized.", EventLogEntryType.Information);
        }

        public void Dispose()
        {
            //Cleanup
        }

        private void Application_AuthenticateRequest(object source, EventArgs e)
        {
            HttpContext context = HttpContext.Current;
            eventLog.WriteEntry("Authentication for " + context.Request.Url + " from " + context.Request.UserHostAddress, EventLogEntryType.Information);
            if (context.Request.Url.ToString().Contains("protected"))
            {
                context.Response.Redirect("https://journal.emergentpublications.com/restricted-content/");
            }
        }

        private bool IsValidIpAddress(string ipAddress)
        {
            return false;
        }

        private string IsSubscribed(HttpContext context)
        {
            return null;
        }
    }
}

编译完成后,WpJournalHttpHandler被加载到GAC中,因此可以通过web.config找到它。请注意,WP项目实际上是使用&#34; PHP Tools for Visual Studio 2013&#34;构建的PHP项目。现在我可以使用C#.NET为我的WP内容编写任何我想要的访问逻辑,只要我更改Post / Article的slug以包含一些常见的字符串,例如&#34; protected&#34; (我可能会使用不太可能实际出现在帖子/文章标题中的字符串 - 可能是一个简短的随机字母数字)。

请注意,如果您像我一样使用事件记录,则需要授予网络服务访问事件日志的权限。