RequireSSL завершается с ошибкой на URL с Querystring - PullRequest
1 голос
/ 31 октября 2009

Я использую этот код, который взят из фьючерсов MVC, и присоединяю Attribute RequireSsl к действию. Он работает с простым URL-адресом, таким как http://localhost/de/Account/Login,, но если у меня есть строка запроса, вопросительный знак кодируется по URL-адресу, и запрос не выполняется.

http://localhost/de/Account/Login?test=omg перенаправляет на https://localhost/de/Account/Login%3Ftest=omg. Кто-нибудь получил эту работу?

 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public sealed class RequireSslAttribute : FilterAttribute, IAuthorizationFilter
{
    public RequireSslAttribute()
    {
        Redirect = true;
    }

    public bool Redirect { get; set; }

    public void OnAuthorization(AuthorizationContext filterContext)
    {
        //Validate.IsNotNull(filterContext, "filterContext");

        if (!Configuration.EnableSSL) return;

        if (!filterContext.HttpContext.Request.IsSecureConnection)
        {
            // request is not SSL-protected, so throw or redirect
            if (Redirect)
            {
                // form new URL
                UriBuilder builder = new UriBuilder
                {
                    Scheme = "https",
                    Host = filterContext.HttpContext.Request.Url.Host,
                    // use the RawUrl since it works with URL Rewriting
                    Path = filterContext.HttpContext.Request.RawUrl
                };
                filterContext.Result = new RedirectResult(builder.ToString());
            }
            else
            {
                throw new HttpException((int)HttpStatusCode.Forbidden, "Access forbidden. The requested resource requires an SSL connection.");
            }
        }
    }


}

Ответы [ 2 ]

1 голос
/ 08 декабря 2009
UriBuilder builder = new UriBuilder
{
    Scheme = "https",
    Host = filterContext.HttpContext.Request.Url.Host,
    Path = filterContext.HttpContext.Request.Path,
    Query = filterContext.HttpContext.Request.QueryString.ToString ()
};
1 голос
/ 01 ноября 2009

я изменил

 UriBuilder builder = new UriBuilder
                {
                    Scheme = "https",
                    Host = filterContext.HttpContext.Request.Url.Host,
                    // use the RawUrl since it works with URL Rewriting
                    Path = filterContext.HttpContext.Request.RawUrl
                };

Для

                    UriBuilder builder = new UriBuilder
                {
                    Scheme = "https",
                    Host = filterContext.HttpContext.Request.Url.Host,
                    Path = filterContext.HttpContext.Request.Url.LocalPath,
                    Query = filterContext.HttpContext.Request.Url.PathAndQuery

                };

Я не использую UrlRewriting прямо сейчас, поэтому я думаю, это безопасно для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...