Представление двух разных экранов входа в систему на основе ролей - PullRequest
2 голосов
/ 14 ноября 2011

Я пытался выяснить, возможно ли представить два разных экрана входа в систему в зависимости от роли авторизации. Требование простое. У меня две роли: «админ» и «публика». Есть атрибуты «Авторизовать», отмеченные во всех моих методах действия приложений для этих двух ролей.

Теперь в требованиях моего приложения указаны разные экраны входа для «admin» и «public». Экран входа в систему «admin» защищен дополнительным кодом безопасности, который не требуется для «открытого» экрана входа в систему. То, что я искал, - это какой-то способ узнать, кто пытается войти в систему, на основе вызванного метода Action. Если вызванный метод действия украшен Authorize[Roles="admin"], то я бы представил экран входа администратора, тогда как, если вызванный метод действия применяется Authorize[Roles="public"], мне нужно представить общедоступный экран входа.

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

Это может звучать немного странно, но это сценарий, для которого я пытаюсь найти решение.

1 Ответ

2 голосов
/ 14 ноября 2011

Вы можете написать собственный атрибут авторизации, который будет перенаправлять на правильное logon действие:

public class MyAuthorizeAttribute : AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        var roles = Roles.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
        if (roles.Contains("admin", StringComparer.OrdinalIgnoreCase))
        {
            filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new
            {
                controller = "account",
                action = "adminlogon",
                returnUrl = filterContext.HttpContext.Request.RawUrl
            }));
        }
        else
        {
            filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new
            {
                controller = "account",
                action = "logon",
                returnUrl = filterContext.HttpContext.Request.RawUrl
            }));
        }
    }
}

, а затем украсьте ваши контроллеры / действия с ним:

[MyAuthorize(Roles = "admin")]
public ActionResult Foo()
{
    return View();
}

[MyAuthorize(Roles = "normaluser")]
public ActionResult Bar()
{
    return View();
}

Теперь, если пользователь, не прошедший проверку подлинности, пытается выполнить действие Foo, он будет перенаправлен на действие /account/adminlogon, а если он попытается выполнить действие Bar, он будет перенаправлен на действие /account/logon. В обоих случаях текущий URL будет передан в качестве параметра returnUrl, чтобы при успешном входе в систему пользователь мог быть перенесен на страницу, которую он первоначально пытался просмотреть.

...