2015-11-26 3 views
0

Вкратце, как вы проверяете, требуется ли авторизация с бритвы?Тест IsAuthorizationRequired from Razor view

ПРИМЕЧАНИЕ: @User.Identity.IsAuthenticated этого не сделает. Меня не интересует, аутентифицирован или авторизован пользователь, но если страница требует авторизации/аутентификации на уровне «global» (макет).

Допустим, есть 2 контроллера, например, так:

[Authorize] 
public class SecretController : Controller 
{ 
    [AllowAnonymous] 
    public ActionResult SecretClue() 
    { 
     return View("oo lala"); 
    } 

    public ActionResult Secret() 
    { 
     return View("Jane kissed ..."); 
    } 
} 


public class RecipesController : Controller 
{ 
    public ActionResult RoastBoar() 
    { 
     return View("One wild boar..."); 
    } 

    [Authorize] 
    public ActionResult SecretSauce() 
    { 
     return View("Mustard, mixed with..."); 
    } 
} 

Как бы я, с точки зрения _Layout бритвы, определить, если страница требует авторизации/аутентификации, например, что, когда он делает это показал <p>Remember SHHHH!</p> линия ?

<!DOCTYPE html> 
<html> 
<head></head> 

<body> 
    <div> 
     @if (ViewBag.IsAuthenticationRequired ?? false) 
     { 
      <p>Remember SHHHH!</p> 
     } 
    </div> 
</body>  

Пожалуйста, не спрашивайте, почему я хочу это сделать, просто ответьте на вопрос, можете ли вы это сделать.

+0

SDK - это не имеет ничего общего с классическим ASP. – Paul

+0

@Paul - извините за теги в спешке – SDK

+0

Знаете ли вы, что если вам действительно нужна авторизация, и у вас нет авторизации, вы не получите страницу? (Я предполагаю, что это так, просто спрашивая). В этом случае, если ваш вопрос будет прочитан: «определить, требуется ли страница * авторизация/аутентификация»/«проверить, требуется ли авторизация *) –

ответ

0

Как это часто бывает, это решение, я бы приветствовать другие, более простые решения ...

public class IsAuthorizationRequiredFilter : IAuthorizationFilter 
{ 
    public IsAuthorizationRequiredFilter() { } 

    public void OnAuthorization(AuthorizationContext filterContext) 
    { 
     bool isAuthorizationRequired = !filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit: true) 
         && !filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit: true) 
         && (filterContext.ActionDescriptor.IsDefined(typeof(AuthorizeAttribute), inherit: true) 
         || filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AuthorizeAttribute), inherit: true)); 

     filterContext.Controller.ViewBag.AuthenticationRequired = isAuthorizationRequired; 
    } 

    private bool IsValid(string key) 
    { 
     return true; 
    } 
} 
+0

Альтернативой является использование ActionFilter и использование рефлекса для проверки атрибута 'Authorize' на' filterContext.ControllerDescription', но я бы не сказал, что это было «проще», чем расширение «AuthorizationFilter» –

+0

Кроме того, гораздо меньше элегантный, с точки зрения, вы можете получить контекст контроллера и снова использовать отражение - непосредственно из .cshtml (поэтому нет необходимости добавлять атрибуты к вашим контроллерам и т. д.). Разрывает парадигму * MVC * и оставляет неприятный вкус во рту, но если он соответствует вашим требованиям. http://stackoverflow.com/questions/6852979/get-current-controller-in-view –