【问题标题】:Asp.Net Identity Unauthorized redirect Not Working with Custom RoutesAsp.Net Identity 未经授权的重定向不适用于自定义路由
【发布时间】:2014-04-15 17:13:21
【问题描述】:

当文件夹被配置为限制对用户的身份验证时,表单身份验证用于重定向到登录页面。在 web.config 中配置的文件夹中。

<system.web>
    <authorization>
      <deny users="?"/>      
    </authorization>
</system.web>

这会将您重定向到登录页面,并带有您最初想去的地方的返回网址。授权有效(Identity 2.0 Beta1 prerelease),但没有重定向到登录页面,尽管我在 Identity 上经历了很多,但我无法做到这一点。现在,在实现其他一切都很好的身份之后,当我尝试访问一个需要我登录的页面时,我看到一个 YSOD 说。

访问处理此请求所需的资源时出错。您可能无权查看请求的资源。

我使用了 vs2013 的默认模板,一旦我输入自定义路由,它就停止工作了,我尝试了很多东西,我就是无法让它工作..

我发现当我启用 FriendlyUrls 或资源的完整路径并使用 url 路由到限制为登录用户的资源时,它起作用了。

例如我有一个位于 /Account/nightlife/stream.aspx 的页面,其中包含文件夹 Account 中的 web.config

因此,当我使用完整路径时 它可以工作 并使用

将我发送到登录页面
http://mylocaliis/login?ReturnUrl=%2FAccount%2Fnightlife%2Fstream.aspx (without the .aspx in the case of friendly urls)

当我几周前使用表单身份验证时,您可以在登录页面看到的自定义路由不存在这个问题

(即-routes.MapPageRoute(routeName:"login", routeUrl:"login",physicalFile:"~/Account/Login.aspx");)

但是使用 Identity 和自定义路由启用了重定向,我看到了 YSOD

例如如果我尝试使用其自定义路由 url 访问资源(当我未登录时)

localhost/stream (defined by the custom route -  routes.MapPageRoute( "nightlife_stream", "stream", "~/Account/nightlife/stream.aspx" ); )

我看到了 YSOD。

【问题讨论】:

    标签: asp.net webforms asp.net-membership url-routing asp.net-identity


    【解决方案1】:

    我正在处理一个遗留项目,必须解决这个问题。

    1. 未经授权的访问通常具有 401 的 Http 代码
    2. 应用程序抛出 YSOD 意味着错误可能必须通过 Global.asax 中的 Application_Error 并且错误可能不一定是 HttpException
    3. 如果是HttpCode 401的错误,则使用HttpContext.Current.ClearError()方法清除当前错误,防止YSOD。

    解决方案:

      void Application_Error(object sender, EventArgs e)
        {
            // Code that runs when an unhandled error occurs
            Exception ex = Server.GetLastError();
            try
            {
                HttpException httpException = (HttpException)ex;
                int httpCode = httpException.GetHttpCode();
                if (httpCode == 401)
                {
                    HttpContext.Current.ClearError();
                    string url = Request.Url.PathAndQuery;
                    Response.Redirect($"~/LogIn/?ReturnUrl={url}");
                }
                else
                {
                    //Log Your Error
                }
    
            }
            catch
            {
                //Log Your Error
            }
    
        }
    

    【讨论】:

      【解决方案2】:

      我知道这篇文章很旧,但我今天也遇到了这个问题并修复了它。基本上,如果您创建一个路由并且用户没有登录但需要登录,您会得到 YSOD(黄屏死机),即使您的 MapPageRoute 为“checkPhysicalUrlAccess”参数指定了 true。

      为了解决这个问题,我在 Global.asax 的 Application_AuthenticationRequest 方法中添加了一个检查。所以,我的代码是这样的......

      在 Global.asax 的 Application_Start 中,我注册了我的路线:

      RouteTable.Routes.MapPageRoute("EditAPage", "editpage/{pageToken}", "Admin/editpage.aspx", true);
      

      然后我将其添加到 Global.asax:

      void Application_AuthenticateRequest(object sender, EventArgs e)
      {
          var user = HttpContext.Current.User;
          string url = Request.Url.ToString();
      
          if (url.Contains("/editpage") && user == null)
          {
              Response.Redirect("~/Account/Login.aspx?ReturnUrl=%2Feditpage");
          }
      }
      

      我需要进一步改进这一点,因为我还有其他页面需要对用户进行身份验证和授权,并且最好不必为我最终添加的每条路线创建单独的检查。 .但是,现在,这是将我的用户重定向到登录。我还需要添加处理以将 {pageToken} 附加到 ReturnUrl - 如果提供了令牌。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-30
        • 2014-10-28
        • 1970-01-01
        • 1970-01-01
        • 2021-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多