博客後臺遷移至i.cnblogs.com及小經驗分享

你們好!咱們已經將博客後臺從原來的 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 。

相關文章
相關標籤/搜索