文章出處

大家好!我們已經將博客后臺從原來的 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 。


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()