Как правильно вернуть вид из контроллера? - PullRequest
0 голосов
/ 29 апреля 2018

У меня есть приложение с логином. У меня есть контроллер и вид. Из контроллера я пытаюсь решить, является ли пользователь администратором или нет, а затем показать конкретное сообщение в поле зрения.

Проблема в том, что когда я запускаю приложение из автозагрузки и нажимаю кнопку входа в систему, приложение перенаправляет меня на домашнюю страницу. Когда я запускаю приложение из представления, оно работает (это глупо, но работает).

Ссылка при запуске приложения prof Startup: localhost:2627/Account/Login
Ссылка при запуске приложения из вида: localhost:2627/Account/LoginReturnUrl=%2FUsers%2FIndex

Это мой контроллер:

public class UsersController : Controller
{
    // GET: Users
    [Authorize]
    public ActionResult Index()
    {
        if (User.Identity.IsAuthenticated)
        {
            var user = User.Identity;
            ViewBag.Name = user.Name;

            ViewBag.displayMenu = "No";

            if (isAdminUser())
            {
                ViewBag.displayMenu = "Yes";
            }
            return View();
        }
        else
        {
            ViewBag.Name = "Not Logged IN";
        }
        //return View();
        return View();

    }

Это мой взгляд:

  @{
        ViewBag.Title = "Index";
    }
    @if (ViewBag.displayMenu == "Yes")
    {
        <h1>Welcome Admin. Now you can create user Role.</h1>
        <h3>
            <li>@Html.ActionLink("Manage Role", "Index", "Role")</li>
        </h3>
    }
    else
    {
        <h2>  Welcome <strong>@ViewBag.Name</strong> :) .We will add user module soon </h2>
    }  

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

Что я делаю не так? Есть ли у вас какие-либо предложения?

Спасибо!

1 Ответ

0 голосов
/ 29 апреля 2018

Причина, по которой оно работает, когда вы запускаете приложение с точки зрения пользователя, заключается в том, что вы пытаетесь получить доступ к защищенному ресурсу (то есть ресурсу, требующему аутентификации). Когда пользователь не аутентифицирован, поведение по умолчанию состоит в том, чтобы вызвать пользователя (то есть аутентифицировать пользователя), и пользователь перенаправляется на страницу входа в систему. Когда пользователь перенаправляется, задается параметр запроса returnUrl, чтобы пользователь мог быть перенаправлен обратно на этот ресурс после проверки подлинности. В этом случае returnUrl является представлением индекса пользователя.

Ссылка при запуске приложения из Вид: локальный: 2627 / счета / LoginReturnUrl =% 2FUsers% 2FIndex

Звучит так, будто вы хотите, чтобы представление Users было вашей домашней страницей или, по крайней мере, страницей, на которую пользователь перенаправляется после входа в систему. В вашем AccountController вы захотите форсировать это действие, если это желаемое поведение.

например:

   switch (result)   
        {   
            case SignInStatus.Success:   
                return return RedirectToAction("Index", "Users");
             ...
       }

Вы также можете остерегаться, если присутствует returnUrl. Исходя из ваших требований, вы можете дать returnUrl наивысший приоритет.

            If ( SignInStatus.Success)
            {
                return !string.IsNullOrEmpty(returnUrl) ?
                       RedirectToLocal(returnUrl):
                       RedirectToAction("Index", "Users");
            }

По сути, все сводится к тому, куда вы хотите отправить (он же маршрут) пользователя после аутентификации. Возможно, пользователь предпочитает свою домашнюю страницу или что, если пользователь является администратором, вы всегда направляете его в индексное представление в UsersController.

В демонстрационном проекте вы должны просмотреть файл Start.Auth.cs и ознакомиться с параметрами аутентификации.

Например, LoginPath устанавливается в этом файле. Это путь, по которому пользователь будет перенаправлен для проверки подлинности.

        // Enable the application to use a cookie to store information for the signed in user
        // and to use a cookie to temporarily store information about a user logging in with a third party login provider
        // Configure the sign in cookie
        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Account/Login"),
            Provider = new CookieAuthenticationProvider
            {...}

        });  

Ссылка RedirectToAction:

http://msdn.microsoft.com/en-us/library/dd470594.aspx

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