如何在.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请求
看一下付费会员专业版,它应该完成你正在寻找的,而无需编写任何代码。
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标题中的字符串——可能是一个随机的短字母数字)。
请注意,如果你像我一样使用事件日志,你需要给网络服务访问事件日志的权限。