博客后台迁移至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 。

相关文章
相关标签/搜索