大家好!我們已經將博客后臺從原來的 www.cnblogs.com/博客地址名/admin/ 遷移至獨立的二級域名 i.cnblogs.com。如果您發現任何問題,麻煩您立即向我們反饋。
雖然這次遷移看起來只是網址的切換,但對我們來說卻是重要的一步——將博客后臺的代碼從博客主站剝離出來,為博客后臺后續的大幅度改進作好了準備。
i.cnblogs.com 是一個 ASP.NET MVC 與 WebForms 的混合環境,在將博客后臺的代碼從 www.cnblogs.com 搬家至 i.cnblogs.com 的過程中,我們遇到了一些問題,在這篇博文中分享一下。
由于博客后臺必須要登錄后才能訪問,所以我們在 web.config 中添加了如下的設置:
<authorization> <deny users="?" /> </authorization>
可是,添加之后,發現對MVC根本不起作用。我們用的 ASP.NET MVC 的版本是5.1,看來是引入 MVC 之后,這個設置被報廢了。
后來在 blogs.msdn.com 的一篇博文(Securing your ASP.NET MVC 4 App and the new AllowAnonymous Attribute)中找到了解決方法——在 RegisterGlobalFilters() 中注冊 AuthorizeAttribute,代碼如下:
protected void Application_Start() { FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); } public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new AuthorizeAttribute()); } }
這樣注冊后,就不需要在每個Aciont上添加[Authorize]標記了。
博客后臺除了要求登錄之外,還有一個需求——只有開通博客了的帳戶才能訪問,如何全局處理這種情況呢?
這里再次用到了 AuthorizeAttribute,但需要實現自己的 AuthorizeAttribute,示例代碼如下:
public class BlogAuthorizeAttribute : AuthorizeAttribute { protected override bool AuthorizeCore(HttpContextBase httpContext) { var result = base.AuthorizeCore(httpContext); if (result) { //判斷當前帳戶是否開通了博客 } return result; } }
然后在 RegisterGlobalFilters() 中將 filters.Add(new AuthorizeAttribute()); 改為 filters.Add(new BlogAuthorizeAttribute());
public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new BlogAuthorizeAttribute()); } }
可是,這樣做之后發現只對 MVC 有效,對 WebForms 無效。于是,只能針對 .aspx 專門處理一下,.aspx 頁面都繼承自一個基類,在基類中進行處理。
還好,這個問題影響不大,因為在遷移過來之后,我們要做的第一項改進就是將所有的 .aspx 改為 MVC 。
文章列表