У меня есть сайт WordPress для небольшого журнала. Он размещен в IIS на Azure VM и использует MSSQL, а не MySQL. Хотя большая часть контента свободно доступна, я хочу ограничить доступ к более позднему контенту только для оплаты подписчиков. Мне интересно, как я могу это сделать. Я думал о добавлении простого кода в пул каждого сообщения / статьи (возможно, просто с запуском пули с «защищенным»). Затем я мог бы написать C # .NET HttpHandler, чтобы проверить Uri для «защищенного» кода, проверить, имеет ли пользователь доступ к нему через записи в БД и разрешает или нет доступ. Будет ли этот подход работать? Любые другие возможности.
Обратите внимание, что я не разработчик PHP, и любое решение должно быть реализовано с помощью .NET.
EDIT 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.
Я хочу перенаправить всякий раз, когда пользователь пытается просмотреть сообщение / статью, содержащую «защищенный», например https://journal.emergentpublications.com/article/protected_eco_010101/
Однако WP использует переписывание URL, поэтому мой HttpModule никогда не получает исходный URL для обработки. Нужно ли, чтобы HttpModule запускался до перезаписи URL?
Вот запись перезаписи в моем 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>
EDIT 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.Request.Url.ToString (). Содержит («защищен») как часть события AuthenticateRequest. Теперь я могу фильтровать запросы WP по желанию.
Взгляните на Paid Memberships Pro, он должен выполнить то, что вы ищете, без необходимости писать какой-либо код.
http://www.paidmembershipspro.com/
Примечание. Я не пытаюсь что-то продать, я просто поклонник их продукта и использовал его на нескольких реализациях wordpress.
Добавление C # .NET HttpModule работало в конце. Полный web.config для сайта WordPress, размещенного в IIS, является:
<?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, созданным с использованием « PHP Tools for Visual Studio 2013 ». Теперь я могу написать любую логику доступа, которая требуется для моего содержимого WP, используя C # .NET, до тех пор, пока я изменяю пул Post / Article, чтобы включить некоторую общую строку, такую как «protected» (я, вероятно, буду использовать строку с меньшей вероятностью фактически появляться в заголовке Post / Article – возможно, коротком случайном алфавитно-цифровом).
Обратите внимание, что если вы используете Event Logging, как я, вам нужно предоставить разрешение Network Service для доступа к журналам событий.