7

asp.net mvc ページの一部のアクションで認証属性を使用して、認証されていない場合にユーザーをログイン画面に誘導しています。私の問題は、ログイン後に参照ページに戻すことです。参照アクションと参照コントローラーを追跡しているだけでしたが、いくつかのパラメーターも追跡する必要がある場合は問題になります。私が知らない気の利いた組み込みのトリックはありますか?

4

3 に答える 3

3

FormsAuthentication を使用している場合、ASP.NET がユーザーをログイン ページにリダイレクトすると、URL は次のようになります。

http://www.mysite.com/Login?ReturnUrl=/Something

FormsAuthentication がそれを取得してリダイレクトできるように、ログイン フォームの action 属性には同じ ReturnUrl パラメータを (非表示の入力として、または Url の一部として) 持つ必要があります。

<form action="Login?ReturnUrl=<%=Html.AttributeEncode(Request.QueryString["ReturnUrl"]) %>"></form>

また

<form><input type="hidden" name="ReturnUrl" id="ReturnUrl" value="<%=Html.AttributeEncode(Request.QueryString["ReturnUrl"])"%> /></form>
于 2008-10-08T08:16:29.493 に答える
2

そのためにやったことはやり過ぎかもしれませんし、他の方法も見てみたいです。ただし、これが私のコードです。

コンテキストをモックするために Moq を使用していることに注意してください...そして、クエリ文字列についてはまだ何もしていません (私のルートにはクエリ文字列が含まれていません)。

var urlReferrer = Request.UrlReferrer;
if (urlReferrer != null)
{
    var url = "~" + Server.UrlDecode(urlReferrer.PathAndQuery);

    // get routecollection
    var routeCollection = new RouteCollection();
    GlobalApplication.RegisterRoutes(routeCollection);

    // mcok context
    var context = new Mock<HttpContextBase>();
    var request = new Mock<HttpRequestBase>();
    context.Expect(ctx => ctx.Request).Returns(request.Object);

    // mock request
    // TODO: convert querystring to namevaluecollection
    // now it's just stripped
    if (url.IndexOf('?') > 0)
    {
        url = url.Substring(0, url.IndexOf('?'));
    }

    var mock = Mock.Get(context.Object.Request);

    // TODO: insert namevaluecollection of querystring
    mock.Expect(req => req.QueryString).Returns(new NameValueCollection());
    mock.Expect(req => req.AppRelativeCurrentExecutionFilePath).Returns(url);
    mock.Expect(req => req.PathInfo).Returns(string.Empty); 

    // get routedata with mocked context
    var routeData = routeCollection.GetRouteData(context.Object);
    var values = routeData.Values;

    return RedirectToAction(routeData.Values["action"].ToString(), values);
}

私が言ったように、それは少し複雑すぎるかもしれません:)

于 2008-10-08T08:05:42.807 に答える
0

参照 URL がドメイン内にあり、それらが由来する可能性のあるもっともらしい文字列であることを常に確認する必要があります。そうしないと、これがフラッシュやその他のクライアント側のテクノロジーで使用され、応答分割やその他の既知および未知の攻撃が行われる可能性があります。

HTTP リファラーはユーザー入力であり、他のものと同様に検証する必要があります。

于 2008-10-08T17:53:31.013 に答える