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