大家也许看了我之前的一篇文章讲述如何定制DNN登陆页面的文章:
如何定制登陆页面, 然后尝试新建一个页面测试一下, 最后也许误删了该页面的Account Login模块(登陆模块)而导致了你的站点无法登陆, 这时我们怎么回滚这些设置呢? 遗憾的是, DNN并没有对此类问题提供什么好的操作界面或解决方案, 最后还得我们这些DNN Fans(Developer)来挖掘问题的出路和解决方案. 我想大家第一想到方案应该就是直接暴力修改数据库了, 对, 我想在此能分享的也就是暴力解决方案, 其中的原理很简单, 因为DNN默认登陆Url一般可通过这样得到
http://yourwebsite/default.aspx?ctl=login (也是原始url, 没有任何Url Rewrite, 如果你深入研究会发现这一页面或是首页或是当前页面), 如果你按照我前边文章定制了登陆页面的话, 那无非就是Portal 的属性LoginTabId 修改为新的页面的TabID( 比如 100, 231), 这时当你点击登陆链接时DNN将根据站点设置跳转到对应的页面, 仔细研读下列代码可知其中奥秘:
- If PortalSettings.LoginTabId <> -1 And Request.QueryString("override") Is Nothing Then
- ' user defined tab
- Response.Redirect(NavigateURL(PortalSettings.LoginTabId, "", "returnurl=" & ReturnUrl), True)
- Else
- ' portal tab
- If PortalSettings.HomeTabId <> -1 Then
- Response.Redirect(NavigateURL(PortalSettings.HomeTabId, "Login", "returnurl=" & ReturnUrl), True)
- Else
- Response.Redirect(NavigateURL(PortalSettings.ActiveTab.TabID, "Login", "returnurl=" & ReturnUrl), True)
- End If
- End If
- End If
好, 现在你应该也知道如何解决了吧, 有两种方式(都不是独创的, 直接Copy过来, 本着分享的原则, 详细请看相关链接):
1) 如果你有数据库权限, 那就执行这一SQL语句:
- Update Portals Set LoginTabId=NULL Where PortalId=xx /* xx代表你站点对应的PortalID, 一般是0 */
最后记得清一下缓存(重启IIS或"修改"Web.config或其他类似方式)
2) 复制下面的代码,另存为 resetlogin.aspx
<%@ Page Language="c#" AutoEventWireup="false" %>
<%@ Import Namespace="DotNetNuke.Entities.Portals"%>
<%@ Import Namespace="DotNetNuke.Data"%>
<%@ Import Namespace="DotNetNuke.Common.Utilities"%>
<%
PortalSettings portalSettings = (PortalSettings)HttpContext.Current.Items["PortalSettings"];
//build a query to update DB
string sql = String.Concat("Update {databaseOwner}{objectQualifier}Portals Set LoginTabId=NULL Where PortalId=", portalSettings.PortalId);
DataProvider.Instance().ExecuteScript( sql );
// clear portal settings
DataCache.ClearPortalCache(portalSettings.PortalId, true);
Response.Redirect("default.aspx?ctl=login");
%>
将 resetlogin.aspx 上传到站点根目录下, 然后通过Url访问这一文件(http://yourwebsite/resetlogin.aspx )将自动更新Portal的LoginTabID为null, 从而达到回滚原始设置的目的, 最后记得把这一文件删除了。
评论