自定义授权属性HttpContext.Request.RawUrl意外结果

时间:2010-03-03 18:18:44

标签: asp.net-mvc

我们正在构建一个Silverlight客户端应用程序,但我们已经创建了一个MVC控制器和一些简单的视图来处理此应用程序的Silverlight控件的身份验证和托管。作为安全实现的一部分,我已经创建了一个自定义的Authorization过滤器属性来处理这个问题,但是在验证后尝试正确处理重定向时会出现一些意外结果。

例如,我们的Silverlight应用程序的导航框架允许用户深入链接到应用程序本身内的各个页面,例如http://myapplicaton.com/#/Product/171。我想要的是能够强制用户登录以查看此页面,但在成功进行身份验证后成功将其重定向回到该页面。我的问题是获取完整的请求URL以将用户重定向到我的自定义授权过滤器属性类中。

这就是我的属性代码:

public class RequiresAuthenticationAttribute : FilterAttribute, IAuthorizationFilter
{
    protected bool AuthorizeCore(HttpContextBase httpContext)
    {
        var cookie = Cookie.Get(SilverlightApplication.Name);

        if (SilverlightApplication.RequiresLogin)
        {
            return 
                ((cookie == null) ||
                 (cookie["Username"] != httpContext.User.Identity.Name) ||
                 (cookie["ApplicationName"] != SilverlightApplication.Name) ||
                 (Convert.ToDateTime(cookie["Timeout"]) >= DateTime.Now));
        }
        else
            return false;
    }

    public void OnAuthorization(AuthorizationContext filterContext)
    {
        if (filterContext != null && AuthorizeCore(filterContext.HttpContext))
        {
            var redirectPath = "~/login{0}";
            var returnUrl = filterContext.HttpContext.Request.RawUrl;
            if (string.IsNullOrEmpty(returnUrl) || returnUrl == "/")
                redirectPath = string.Format(redirectPath, string.Empty);
            else
                redirectPath = string.Format(redirectPath, string.Format("?returnUrl={0}", returnUrl));

            filterContext.Result = new RedirectResult(redirectPath);
        }
    }
}

所以在这种情况下,如果我直接浏览http://myapplicaton.com/#/Product/171,在OnAuthorize方法中,我抓住了filterContext.HttpContext.Request.RawUrl属性,我希望它的值是“/#/产品/ 171“,但事实并非如此。它总是只是“/”。该属性不包含页面级链接吗?我错过了什么吗?

1 个答案:

答案 0 :(得分:1)

#登录网址(也称为网址的fragment部分)仅供浏览器用于在历史记录和链接之间导航。此标志后面的所有内容都从不发送到服务器,并且无法在服务器端脚本中获取它。