你們好!咱們已經將博客後臺從原來的 www.cnblogs.com/博客地址名/admin/ 遷移至獨立的二級域名 i.cnblogs.com。若是您發現任何問題,麻煩您當即向咱們反饋。web
雖然此次遷移看起來只是網址的切換,但對咱們來講倒是重要的一步——將博客後臺的代碼從博客主站剝離出來,爲博客後臺後續的大幅度改進做好了準備。mvc
i.cnblogs.com 是一個 ASP.NET MVC 與 WebForms 的混合環境,在將博客後臺的代碼從 www.cnblogs.com 搬家至 i.cnblogs.com 的過程當中,咱們遇到了一些問題,在這篇博文中分享一下。app
因爲博客後臺必需要登陸後才能訪問,因此咱們在 web.config 中添加了以下的設置:ide
<authorization> <deny users="?" /> </authorization>
但是,添加以後,發現對MVC根本不起做用。咱們用的 ASP.NET MVC 的版本是5.1,看來是引入 MVC 以後,這個設置被報廢了。spa
後來在 blogs.msdn.com 的一篇博文(Securing your ASP.NET MVC 4 App and the new AllowAnonymous Attribute)中找到了解決方法——在 RegisterGlobalFilters() 中註冊 AuthorizeAttribute,代碼以下:code
protected void Application_Start() { FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); } public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new AuthorizeAttribute()); } }
這樣註冊後,就不須要在每一個Aciont上添加[Authorize]標記了。orm
博客後臺除了要求登陸以外,還有一個需求——只有開通博客了的賬戶才能訪問,如何全局處理這種狀況呢?blog
這裏再次用到了 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());ci
public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new BlogAuthorizeAttribute()); } }
但是,這樣作以後發現只對 MVC 有效,對 WebForms 無效。因而,只能針對 .aspx 專門處理一下,.aspx 頁面都繼承自一個基類,在基類中進行處理。
還好,這個問題影響不大,由於在遷移過來以後,咱們要作的第一項改進就是將全部的 .aspx 改成 MVC 。