【问题标题】:Test IsAuthorizationRequired from Razor view测试是否需要从 Razor 视图授权
【发布时间】:2016-02-29 08:32:24
【问题描述】:

简而言之,您如何从剃刀视图检查是否需要授权?

注意:@User.Identity.IsAuthenticated 不会这样做。我对用户是否经过身份验证或授权不感兴趣 - 而是页面是否需要“全局”(布局良好)级别的授权/身份验证。

假设有 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 razor 视图确定页面是否需要授权/身份验证,以便在需要时显示<p>Remember SHHHH!</p> 行?

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

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

请不要问我为什么要这样做,如果可以,请回答问题。

【问题讨论】:

  • SDK - 这与经典 ASP 无关。
  • @Paul - 抱歉匆忙标记
  • 您是否知道如果您确实需要授权而您没有授权,您将不会获得该页面? (我假设是这种情况,只是问)。在这种情况下,您的问题应该是:“确定页面是否需要授权/身份验证”/“检查授权是否需要
  • 除了 .cshtml 之外,您可以对您的代码进行任何更改吗?最简单的选择是扩展[Authorize]
  • @freedomn-m 是的,我知道 - 这是处理承载令牌/Cookie 身份验证不匹配的快速而肮脏的方式。我确信有更好的方法,但我稍后会在时间允许时讨论。

标签: asp.net-mvc razor


【解决方案1】:

正如经常发生的那样,这是一个解决方案,我欢迎其他更简单的解决方案...

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;
    }
}

【讨论】:

  • 另一种方法是使用 ActionFilter 并使用反射来检查 filterContext.ControllerDescription 上的 Authorize 属性 - 但我不会说它比扩展 AuthorizationFilter 更“简单”
  • 另外,不那么优雅,从视图中,您可以获取控制器上下文并再次使用反射 - 直接从 .cshtml (因此无需向控制器添加属性等)。打破 MVC 范式并在口中留下不好的味道,但如果它符合您的要求。 stackoverflow.com/questions/6852979/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多