Перенаправление ASP.NET MVC на страницу запрещенного доступа с использованием настраиваемого поставщика ролей

Вероятно, подход @droidev является правильным, но я просто хочу опубликовать что-то немного другое, что делает в основном одно и то же задание и не требует расширения LayoutManager.

ПРИМЕЧАНИЕ здесь - это будет хорошо работать, если ваш элемент (тот, который вы хотите прокрутить вверху списка) виден на экране, и вы просто хотите автоматически прокручивать его вверх. Это полезно, когда последний элемент в вашем списке имеет какое-то действие, которое добавляет новые элементы в один список, и вы хотите сфокусировать пользователя на новых добавленных элементах:

int recyclerViewTop = recyclerView.getTop();
int positionTop = recyclerView.findViewHolderForAdapterPosition(positionToScroll) != null ? recyclerView.findViewHolderForAdapterPosition(positionToScroll).itemView.getTop() : 200;
final int calcOffset = positionTop - recyclerViewTop; 
//then the actual scroll is gonna happen with (x offset = 0) and (y offset = calcOffset)
recyclerView.scrollBy(0, offset);

Идея проста: 1. Нам нужно получить верхнюю координату элемента recyclerview; 2. Нам нужно получить верхнюю координату элемента вида, которую мы хотим прокрутить до вершины; 3. В конце с вычисленным смещением мы должны выполнить

recyclerView.scrollBy(0, offset);

200 - просто пример жесткого кодированного целочисленного значения, которое вы можете использовать, если элемент просмотра не существует, поскольку это возможно .

29
задан EL Yusubov 20 January 2013 в 03:33
поделиться

8 ответов

[AccessDeniedAuthorize(Roles="SuperAdmin")]
public class SuperAdminController : Controller

AccessDeniedAuthorizeAttribute.cs:

public class AccessDeniedAuthorizeAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);

        if(filterContext.Result is HttpUnauthorizedResult)
        {
            filterContext.Result = new RedirectResult("~/AcessDenied.aspx");
        }
    }
}
42
ответ дан eu-ge-ne 20 January 2013 в 03:33
поделиться

Вот мое решение, основанное на ответе Ев-гэ-нэ. Мой правильно перенаправляет пользователя на страницу входа в систему, если они не вошли в систему, но на страницу отказа в доступе, если они вошли в систему, но не авторизованы для просмотра этой страницы.

[AccessDeniedAuthorize(Roles="SuperAdmin")]
public class SuperAdminController : Controller

AccessDeniedAuthorizeAttribute.cs:

public class AccessDeniedAuthorizeAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);
        if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            filterContext.Result = new RedirectResult("~/Account/Logon");
            return;
        }

        if (filterContext.Result is HttpUnauthorizedResult)
        {
            filterContext.Result = new RedirectResult("~/Account/Denied");
        }
    }
}

AccountController.cs:

public ActionResult Denied()
{
    return View();
}

Просмотры / Account / Denied.cshtml: (синтаксис Razor)

@{
    ViewBag.Title = "Access Denied";
}

<h2>@ViewBag.Title</h2>

Sorry, but you don't have access to that page.
25
ответ дан Matt Frear 20 January 2013 в 03:33
поделиться

Взгляните на tvanfosson Ответ из на этот очень похожий вопрос , это то, что я делаю (Спасибо tvanfosson), поэтому теперь я просто должен сказать:

[MyAuthorize(Roles="SuperAdmin",ViewName="AccessDenied")]
public class SuperAdminController : Controller
...

Если пользователь не в роли, он получит представление w, указанное в ViewName.

8
ответ дан Community 20 January 2013 в 03:33
поделиться

Небольшое улучшение ответа Мэтта, благодаря отсутствию необходимости жестко кодировать страницу входа в систему и, при необходимости, настройку представления отказа в доступе в атрибуте:

public class AccessDeniedAuthorizeAttribute : AuthorizeAttribute
{
    public string AccessDeniedViewName { get; set; }

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);

        if (filterContext.HttpContext.User.Identity.IsAuthenticated &&
            filterContext.Result is HttpUnauthorizedResult)
        {
            if (string.IsNullOrWhiteSpace(AccessDeniedViewName))
                AccessDeniedViewName = "~/Account/AccessDenied";

            filterContext.Result = new RedirectResult(AccessDeniedViewName);
        }
    }
}
6
ответ дан Vic Alcazar 20 January 2013 в 03:33
поделиться

Перенаправление не всегда является лучшим решением

Используйте стандартный http-код 403:

return new HttpStatusCodeResult(HttpStatusCode.Forbidden);
6
ответ дан devi 20 January 2013 в 03:33
поделиться
public class AccessDeniedAuthorizeAttribute : AuthorizeAttribute
    {
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            base.OnAuthorization(filterContext);

            if (filterContext.Result is HttpUnauthorizedResult && WebSecurity.IsAuthenticated)
            {
                filterContext.Result = new RedirectResult("~/Account/AccessDenied");
            }
        }
    }
0
ответ дан Yuriy 20 January 2013 в 03:33
поделиться

Я основывался на ответе Вика, чтобы позволить мне иметь разные страницы «Отказано в доступе» для каждой области приложения. Сделали это, вернув вместо этого RedirectToRouteResult, который вместо перенаправления на URL-адрес относительно корня приложения перенаправляет на контроллер текущей области и действие:

public class AccessDeniedAuthorizeAttribute : AuthorizeAttribute
{
    public string AccessDeniedController { get; set; }
    public string AccessDeniedAction { get; set; }

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);

        if (filterContext.HttpContext.User.Identity.IsAuthenticated &&
            filterContext.Result is HttpUnauthorizedResult)
        {
            if (String.IsNullOrWhiteSpace(AccessDeniedController) || String.IsNullOrWhiteSpace(AccessDeniedAction))
            {
                AccessDeniedController = "Home";
                AccessDeniedAction = "AccessDenied";
            }

            filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { Controller = AccessDeniedController, Action = AccessDeniedAction }));
        }
    }
}
0
ответ дан Farinha 20 January 2013 в 03:33
поделиться

Просто небольшое обновление Vic Alcazar, добавлены детали URL запроса в перенаправлении, чтобы можно было регистрировать детали отказа в доступе и кто, если хочет

public class AccessDeniedAuthorizeAttribute : AuthorizeAttribute
{
    public string AccessDeniedViewName { get; set; }

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);

        if (filterContext.HttpContext.User.Identity.IsAuthenticated &&
            filterContext.Result is HttpUnauthorizedResult)
        {
            if (string.IsNullOrWhiteSpace(AccessDeniedViewName))
                AccessDeniedViewName = "~/Account/AccessDenied";

            var requestUrl = filterContext.HttpContext.Request.Url;

            filterContext.Result = new RedirectResult(String.Format("{0}?RequestUrl={1}", AccessDeniedViewName, requestUrl));
        }
    }
}
0
ответ дан True Solutions 20 January 2013 в 03:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: