MVC логин вместо редиректтологина - PullRequest
5 голосов
/ 23 ноября 2010

Я хотел бы открыть окно входа в систему, когда пользователь пытается получить доступ к защищенной веб-странице, а не перенаправлять на страницу входа в систему.

Я хочу сделать это с помощью MVC и jquery, но не через MSсценарии ajax.Все страницы используют одну и ту же главную страницу, и я использую формы аутентификации.У меня всплывающее окно входа в систему работает, когда пользователь нажимает на ссылку входа в систему на странице, проблема в том, что когда они нажимают на ссылку, ведущую на защищенную страницу, я перенаправляюсь на страницу входа.

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

Кто-нибудь сделал это или у вас есть какие-либо предложения о том, как это сделать?

TIA

Ответы [ 2 ]

4 голосов
/ 24 ноября 2010

alt text

Это довольно легко, я недавно создал POC с помощью colorbox:

JQuery:

 <script src="../../Scripts/jquery.colorbox.js" type="text/javascript"></script>

<link href="<%= "../../Content/colorbox.css?version=" + Guid.NewGuid() %>" rel="stylesheet" type="text/css" />

<script type="text/javascript"  >


    $('FORM#login').live("submit", function() {
    Sys.Mvc.FormContext._Application_Load();
    $.colorbox.resize(); 
    });

    $(document).ready(function() {


        $('#change_password').click(function() {

            var url = $(this).attr("Href");
            $.ajax({ url: url, cache: false, success: function(data) {
                if (data != '') {
                    $.colorbox({ html: data, scrolling:false, opacity:0.85});
                }
                else {
                    alert(url);
                    window.location = url;
                }
            }

            });

            return false;
        });




    });

</script>

Просмотр:

Домашняя страница

<% = Html.Encode (ViewData ["Message"])%>

Чтобы узнать больше о посещении ASP.NET MVC http://asp.net/mvc.

<div><a id="change_password" href=" <%= Url.Content("~/Account/ChangePassword") %>" title="Change Password">Change Password</a></div>
<div id="logOn_Control"></div>

Контроллер:

[AjaxAuthorize]
    //[Authorize]
    [HttpPost]
    public ActionResult ChangePassword(ChangePasswordModel model)
    {
        if (ModelState.IsValid)
        {
            if (MembershipService.ChangePassword(User.Identity.Name, model.OldPassword, model.NewPassword))
            {
                return RedirectToAction("ChangePasswordSuccess");
            }
            else
            {
                ModelState.AddModelError("", "The current password is incorrect or the new password is invalid.");
            }
        }

Фильтр действий:

 public class AjaxAuthorizeAttribute : AuthorizeAttribute   
{   
    public string View { get; set; }   

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)   
    {


        if (!filterContext.HttpContext.Request.IsAjaxRequest())   
        {

            base.HandleUnauthorizedRequest(filterContext);
            return;   


        }

        var route = filterContext.HttpContext.Request.Path;
        var viewData = new ViewDataDictionary { { "returnUrl", route } };

        filterContext.Result = new ViewResult { ViewName = View, ViewData = viewData };

    }

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        if (filterContext.HttpContext.User.Identity.IsAuthenticated && filterContext.HttpContext.Request.IsAjaxRequest())
        {
            filterContext.Result = new EmptyResult();
            return;
        }
        base.OnAuthorization(filterContext);
    }



}
        // If we got this far, something failed, redisplay form
        ViewData["PasswordLength"] = MembershipService.MinPasswordLength;
        return View(model);
    }
1 голос
/ 23 ноября 2010

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

Я могу подумать о трех дрянных вариантах, возможно, они дают вам другие идеи.

  1. Каким-то образом есть список ссылок «сохранить» в Javascript: когда пользователь не вошел в систему, JS проверяет ссылку и список сохранения и действует соответственно.
  2. Когда вы не вошли в систему,нажимая на ссылку, вы сначала делаете запрос jQuery к этой странице, если с ответом все в порядке, вы позволяете пользователю уйти, если ответ является вашей защищенной страницей, вы открываете всплывающее окно.
  3. Не проверяйте ничего, дайте пользователю перейти на «страницу входа», но позвольте странице входа перенаправить пользователя обратно на предыдущую страницу, добавьте некоторый параметр строки запроса, и когда мастер-страница найдет этот параметр строки запросаПозвольте ему открыть диалог входа в систему.(Надеюсь, это понятно).Вы действительно удаляетесь, но возвращаетесь к своей исходной странице.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...