博客后台迁移至i.cnblogs.com及小经验分享

大家好!我们已经将博客后台从原来的 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 。

posted @ 2014-02-27 18:21  博客园团队  阅读(3434)  评论(12编辑  收藏  举报