16

ASP.NET MVC プロジェクトでは、クラスまたはメソッドを [Authorize] で装飾し、承認が失敗すると、サイトは (web.config で指定された loginUrl を使用して) ログイン ページに自動的にリダイレクトされます。さらに、ASP.NET MVC フレームワークの何かが、元の要求の URL を ReturnUrl パラメーターとして渡します。

この ReturnUrl を追加する役割は何ですか? プロジェクト テンプレートにコードが見つかりませんでした。ASP.NET スタックソース コードの AuthorizeAttribute のコードも調べましたが、何も見つかりませんでした。また、ASP.NET スタック ソース コード全体で "returnurl" を検索しようとしましたが、何も見つかりませんでした。

私が尋ねる理由は、このプロセスでバグを発見したからです。これは、新しいインターネット ASP.NET MVC プロジェクトで確認できます。Web.config で FormsAuth タイムアウトを 1 分に設定してから、サインインします。1 分以上待ってから、サインアウトを試みます。これにより、/account/logoff の ReturnUrl を使用してログイン ページにリダイレクトされ、ログイン後に 404 が発生します。今のところ、独自の AuthorizeAttribute を使用してこれを回避しました。

public class MyAuthorizeAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);

        if (filterContext.Result is HttpUnauthorizedResult)
        {
            string returnUrl = null;
            if (filterContext.HttpContext.Request.HttpMethod.Equals("GET", System.StringComparison.CurrentCultureIgnoreCase))
                returnUrl = filterContext.HttpContext.Request.RawUrl;

            filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary()
            {
                { "client", filterContext.RouteData.Values[ "client" ] },
                { "controller", "Account" },
                { "action", "Login" },
                { "ReturnUrl", returnUrl }
            });
        }
    }
}

ただし、ソースを見て、このバグが実際にバグである場合、なぜこのバグが存在するのかを理解できるかどうかを確認したいと思います。

4

2 に答える 2

1

これを試して

 returnUrl = filterContext.HttpContext.Request.Url.GetComponents(UriComponents.PathAndQuery, UriFormat.SafeUnescaped) ;

私はここでそれを見つけましたカスタムAuthorizeAttributeで戻りURLを生成します

これは私にとってはうまくいきます。

于 2015-08-14T12:40:09.647 に答える