Я бы сказал, что это довольно необычная задача, потому что этот тип логики обычно обрабатывается на стороне сервера, а не на стороне клиента. Это потому, что вы обычно не хотите увеличивать полезную нагрузку клиента больше, чем вам нужно - и если пользователь не вошел в систему - он никогда не будет нуждаться в этом контенте. Кроме того, очевидно, что при работе с конфиденциальными данными существуют последствия для безопасности, поскольку информация легко просматривается в базовой разметке.
За исключением всех заявлений об отказе. Если вы действительно хотите это сделать, я думаю, что лучшим решением было бы просто заставить сайт работать так же, как вы привыкли в Sitefinity. В DNN вы должны создать контейнер, который содержит соответствующую логику. Контейнер оборачивает каждый модуль, и внутри контейнера у вас есть возможность написать любой код (сервер или клиент), чтобы сделать ваш контейнер динамическим.
Для этого примера грубой силы я изменил контейнер "Invisible.ascx", который поставляется со скином DarkKnight в DNN 6:
<%@ Control language="C#" AutoEventWireup="false" Inherits="DotNetNuke.UI.Containers.Container" %>
<%
var isLoggedIn = HttpContext.Current.User.Identity.IsAuthenticated;
if (isLoggedIn)
{
%>
<div class="dnn-logged-in">
<% } %>
<div class="Invisible"><div id="ContentPane" runat="server"></div></div>
<% if (isLoggedIn) { %>
</div>
<% } %>
Это даст следующий HTML, если не аутентифицирован:
<div class="DnnModule DnnModule-DNN_HTML DnnModule-364">
<a name="364"></a>
<div class="Invisible">
<div id="dnn_ctr364_ContentPane">
[Dynamic Content Here]
</div>
</div>
</div>
и это, когда вы аутентифицированы:
<div class="DnnModule DnnModule-DNN_HTML DnnModule-364">
<a name="364"></a>
<div class="dnn-logged-in">
<div class="Invisible">
<div id="dnn_ctr364_ContentPane">
[Dynamic Content Here]
</div>
</div>
</div>
</div>
Если вы хотите везде использовать эту логику, я бы просто улучшил каждый из контейнеров, которые вы используете в данный момент, с помощью этого типа логики.