如何在.net / php应用程序中限制访问WordPress内容

本文关键字:访问 WordPress 内容 应用程序 net php | 更新日期: 2023-09-27 18:18:50

我有一个小型日志的WordPress站点。它托管在Azure虚拟机上的IIS中,使用MSSQL而不是MySQL。虽然大部分内容都是免费提供的,但我希望只允许付费订阅者访问最新的内容。我在想我该怎么做。我正在考虑添加一些简单的代码到每个帖子/文章的段塞(也许只是让段塞以"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。

我想在用户试图查看包含'protected'的Post/Article时进行重定向,例如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的重写部分之后。配置:

<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(). contains ("protected")作为AuthenticateRequest事件的一部分,我现在可以根据需要过滤WP请求

如何在.net / php应用程序中限制访问WordPress内容

看一下付费会员专业版,它应该完成你正在寻找的,而无需编写任何代码。

http://www.paidmembershipspro.com/

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

添加c#。. NET HttpModule工作到最后。完整的网。使用IIS托管的WordPress站点的配置为:

<?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项目实际上是一个使用"PHP Tools for Visual Studio 2013"构建的PHP项目。现在我可以使用c#为我的WP内容编写任何访问逻辑。. NET,只要我改变Post/Article的段符,使其包含一些常见的字符串,如"protected"(我可能会使用一个不太可能实际出现在Post/Article标题中的字符串——可能是一个随机的短字母数字)。

请注意,如果你像我一样使用事件日志,你需要给网络服务访问事件日志的权限。