Вернуться на страницу со ссылкой - PullRequest
7 голосов
/ 08 октября 2008

Я использую атрибут аутентификации на некоторых из моих действий на странице mvc asp.net, чтобы направлять людей на экран входа в систему, если они не аутентифицировались. Моя проблема заключается в том, чтобы вернуть их на страницу ссылки после того, как они вошли в систему. Я просто отслеживал действие ссылки и контроллер ссылки, но это становится проблематичным, когда мне также необходимо отслеживать некоторые параметры. Есть ли какой-нибудь изящный трюк, о котором я не знаю?

Ответы [ 3 ]

3 голосов
/ 08 октября 2008

Если вы используете FormsAuthentication, когда ASP.NET перенаправляет пользователя на страницу входа, URL выглядит примерно так:

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

Атрибут действия формы входа должен иметь такой же параметр ReturnUrl (как скрытый ввод или как часть Url), чтобы FormsAuthentication могла забрать его и перенаправить, например,

<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>
2 голосов
/ 08 октября 2008

То, что я сделал для достижения этого результата, может быть переусердствовало, и я хотел бы также увидеть некоторые другие методы. Тем не менее, вот мой код.

Обратите внимание, что он использует 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);
}

Как я уже сказал, это может быть немного сложнее:)

0 голосов
/ 08 октября 2008

Вы должны всегда следить за тем, чтобы ссылающийся URL-адрес находился в вашем домене, а также чтобы была правдоподобная строка, из которой они могут исходить. В противном случае это может быть использовано с флеш-памятью или другими технологиями на стороне клиента для выполнения таких действий, как разделение ответов или другие атаки, известные и неизвестные.

HTTP реферер - это пользовательский ввод, и он должен быть проверен как любой другой.

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