Net Web 4.5.1路由未经过身份验证的任何内容

时间:2014-10-14 09:02:07

标签: c# asp.net-web-api asp.net-web-api-routing

使用Net Web 4.5.1

开始尝试在默认文档(即index.html)上配置规则:

 routes.MapPageRoute(
   "Default", 
   "", 
   "~/Statics/anybody.html"
 );

如果在本地调试期间我想要(没有扩展名)

 http://localhost:52065

转到

 http://localhost:52065/Statics/anybody.html

我希望任何未经授权的请求都指向启动页面(即/Statics/anybody.html)。

3 个答案:

答案 0 :(得分:1)

我对发布此内容犹豫不决,但是,您可以这样做:

public class AuthenticatedConstraint : IRouteConstraint
{
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values,
        RouteDirection routeDirection)
    {
        return httpContext.Request.IsAuthenticated;
    }
}

然后你可以使用以下路线:

routes.MapRoute(name: "Default",
    url: "{*url}",
    defaults: "~/Statics/anybody.html", constraints: new AuthenticatedConstraint());
routes.MapRoute(name: "DefaultNotAuthenticated",
    url: "{*url}",
    defaults: "~/Statics/notauth.html");

第一个匹配任何经过身份验证的请求,并将其返回到anybody.html文档;第二个匹配所有未经验证的路由并将它们放在notauth.html文档中。您可以以任何方式调整您的网址。

然而,我提到我对发布此内容犹豫不决;虽然这应该并且将适用于简单的请求,但是ASP.NET MVC路由引擎非常复杂,很多东西都取决于小东西,通配符,处理内容的顺序等等。很容易“意外”使这条路线在你自己的代码中不起作用。

话虽如此,路线并非万无一失。有几种方法可以绕过路由引擎。因此,这本身并不是“安全”的解决方案。无论是在控制器,过滤器还是单个页面上执行此操作,我都会坚持为每个请求检查auth。这将作为一种“额外的”安全措施,有时会在它们到达之前捕获它们,但是如果有什么东西滑过裂缝,页面就会处理自身的安全性。

答案 1 :(得分:0)

尝试在RouteConfig.cs中添加此行

public static void RegisterRoutes(RouteCollection routes)
{
        routes.IgnoreRoute("");
}

答案 2 :(得分:0)

方法1:
如果您正在使用表单身份验证,则可以更改web.config中元素的URL,如果用户无权访问,它将重定向到指定的页面。

      <forms loginUrl="~/Account/Login" defaultUrl="~/Account/Login" slidingExpiration="false" />



方法2:
可以使用操作过滤器,如果用户未经过身份验证,则重定向到指定页面,否则允许当前请求。