问题标签 [authorize-attribute]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
asp.net-mvc-3 - 为什么在使用 Azure 缓存(.NET MVC3 应用程序)时不能组合 [Authorize] 和 [OutputCache] 属性?
使用 Windows AzureMicrosoft.Web.DistributedCache.DistributedCacheOutputCacheProvider
作为 MVC3 应用程序的 outputCache 提供程序。下面是相关的操作方法:
从 Web 浏览器加载此视图时出现以下异常:
如果我删除 [Authorize] 属性,视图会按预期缓存。这是否意味着我不能将 [OutputCache] 放在必须具有 [Authorize] 的操作方法上?或者,我是否需要使用对缓存使用静态验证回调方法的自定义实现来覆盖 AuthorizeAttribute?
更新 1
在 Evan 的回答之后,我在 IIS Express(Azure 之外)中测试了上述操作方法。这是我对 OutputCache 属性上的 VaryByCustom = "User" 属性的覆盖:
当我以 me@mydomain.tld 身份访问示例缓存页面时,页面的输出被缓存,并且视图显示“此页面已缓存于 12/31/2011 11:06:12 AM (UTC)”。如果我随后注销并以 another@otherdomain.tld 身份登录并访问该页面,它会显示“此页面已缓存于 12/31/2011 11:06:38 AM (UTC)”。以 me@mydomain.tld 身份重新登录并重新访问该页面会导致缓存再次显示“此页面已缓存于 12/31/2011 11:06:12 AM (UTC)”。进一步的登录/注销尝试表明,根据用户的不同,正在缓存和返回不同的输出。
这让我相信输出是根据用户单独缓存的,这是我的 VaryByCustom = "User" 设置和覆盖的意图。问题是它不适用于 Azure 的分布式缓存提供程序。Evan,您是否回答仅缓存公共内容仍然有效?
更新 2
我挖掘了源代码,发现开箱即用的 AuthorizeAttribute 实际上确实有一个非静态验证回调。以下是摘录OnAuthorization
:
CacheValidationHandler
将缓存验证委托给protected virtual HttpValidationStatus OnCacheAuthorization(HttpContextBase)
,这当然不是静态的。它不是静态的一个原因是,如上面重要评论中所述,它调用protected virtual bool AuthorizeCore(HttpContextBase)
.
为了从静态缓存验证回调方法执行任何 AuthorizeCore 逻辑,它需要知道 AuthorizeAttribute 实例的用户和角色属性。但是,似乎没有一种简单的插入方法。我必须重写 OnAuthorization 以将这两个值放入 HttpContext(Items 集合?),然后重写 OnCacheAuthorization 以将它们取出。但这闻起来很脏。
如果我们小心地在 OutputCache 属性中使用 VaryByCustom = "User" 属性,我们是否可以重写 OnCacheAuthorization 以始终返回 HttpValidationStatus.Valid?当 action 方法没有 OutputCache 属性时,我们不需要担心这个回调会被调用,对吗?如果我们确实有一个没有 VaryByCustom = "User" 的 OutputCache 属性,那么很明显页面可以返回任何缓存版本,而不管哪个用户请求创建了缓存副本。这有多大风险?
c# - 这个方法是否按照它所说的去做(防止页面被缓存)?
我问的原因是我最初在 custom 中有以下代码AuthorizeAttribute
:
我基本上是在不久前从 StackOverflow 上的一个答案中粘贴了这段代码,然后我把这个逻辑移到了IAuthorizationFilter
.
问题是,通过切换到接口,我失去AuthorizeAttribute
了OnCacheAuthorization
. 根据文档,OnCacheAuthorization
“在缓存模块请求授权时调用”。这并没有真正告诉我我需要做什么来实现这个方法,或者我什至首先需要回调。
问题
- 实际上会
PreventPageFromBeingCached
阻止仅使用两行代码缓存页面,还是我还需要包含cachePolicy.AddValidationCallback(CacheValidateHandler, null);
方法CacheValidateHandler()
(加上 的实现OnCacheAuthorization()
)? - 如果我确实需要额外的代码,它到底是做什么的?
- 如果我都错了,如何防止页面被缓存?
c# - AuthorizeAttribute v Application_AuthenticateRequest
我们想要授权用户,如果他们被授权,我们想要将他们的角色和权限添加到用户并将其添加到 IPrinciple
我们有两种方法,一种是在 global.asax Application_AuthenticateRequest 中进行,另一种是创建一个继承自 AuthorizeAttribute 的属性
这里有什么闪闪发光的好选择吗?
asp.net-mvc - ASP.Net MVC:通过 HTTP_REFERER 将 JSON 请求锁定到站点内
假设我有一个 ASP.Net MVC 站点。如何锁定控制器方法(可能在操作上使用属性),以便 HTTP_REFERER 必须指向我的站点?
扩大:
我的控制器上有许多标记为 [Authorize] 的 JSON 操作,以防止未经授权的*用户进入。
有人鬼鬼祟祟地构建了一个攻击者网页并将其通过电子邮件发送给登录到我网站的用户。该页面包含一个从我的 JSON 控制器操作中获取的脚本。这会导致用户的浏览器向我的授权控制器方法发送登录的 cookie,将该用户的数据返回到攻击者的网页,然后他们可以读取并传递到其他地方。
如果我可以锁定这些请求,以便 HTTP_REFERER 必须指向我的站点,那么请求 JSON 的跨站点攻击将被阻止。最简单的方法是什么?
请注意,我显然不想锁定所有请求,JSON、授权或否 - 人们仍然需要能够链接到该站点。但是,除了我们网站上的页面之外,任何地方都不能访问授权的 JSON 请求。
*是的,我编造了这个词。
asp.net-mvc-3 - Ninject 自定义 AuthorizeAttribute 注入不起作用
我遇到了一些障碍,希望有人能指出我哪里出错了。
我一直在使用 Ninject 注入自定义 ActionFilterAttributes ,这工作正常:
我现在正在尝试注入自定义 AuthorizeAttribute。我的语法正确,因此我插入了 Role 和自定义属性:
该属性正在正确执行并且角色和年份被正确插入,我的问题是我试图注入的服务始终为空:
在正常的 ActionFilterAttributes 中,服务被很好地注入,但这里不是。
任何帮助,将不胜感激
asp.net-mvc-3 - 控制器和操作的集中授权 (ASP.NET MVC 3)
在自定义 AuthorizeAttibute(全局注册)中,是否存在任何可能的安全问题或陷阱,基于控制器类型和被调用的操作应用授权?
例如(不是真正的代码)
c# - 在 Asp.Net MVC 3 中,什么构成了 AuthorizeAttribute 的经过身份验证的用户?
我发现 Asp.Net 中的很多东西都是基于假设的知识。例如,我对互联网身份验证知之甚少,并且很难在初学者级别上找到任何有关它的信息。
令我困惑的一件事是 AuthorizeAttribute。我了解如何使用它以及它应该做什么,但我想知道它是否可以在您拥有自定义登录系统的情况下工作。
在 AuthorizeAttribute 页面上的描述中,它简单地说
When you mark an action method with AuthorizeAttribute, access to that action method is restricted to users who are both authenticated and authorized.
那么什么是经过身份验证的用户,如何设置一个用户进行身份验证。如果我创建自己的登录系统,我该如何设置,以便登录用户的身份验证足以让 AuthorizeAttribute 允许他进入?
asp.net-mvc - 将数据库中的数据放入MVC中的Session
我目前正在研究过滤器 [Authorize] 的扩展,以便我可以从数据库中检索权限。一切正常,但这肯定是一个性能问题。每次我向数据库发送查询请求权限时,这都不是确定这一点的最佳方法。所以我想把这些数据放在Session中。将数据从数据库放入 Session 对象的最快方法是什么,我可以问(LINQ)以及数据库。
现在看起来像:
但我想改成
MySuperSessionSomethink 将保留从数据库中一次性检索到的数据。知道我该怎么做吗?Tx 寻求帮助。
更大的图景
好的。我将展示更大的画面。整个想法是创建自定义授权过滤器。
这是什么目标。创建具有所有优点的授权属性,以及其他功能,例如在数据库中保留有关权限的信息。
现在我要做的是:
在此之后我使用
但是有问题。每次我向数据库询问权限时,恕我直言,这不是最好的方法。现在我的想法是获取一个用户的所有权限,并在他被授权时将他放入他的会话中。也许我错了,这种方式会产生问题,但是保留在数据库中并一直询问权限也不是一个好主意:)。那么,在对数据库提出一两个问题之后,也许更好的方式来获取数据并在代码中使用?
asp.net-mvc - mvc 3会话和authorizeAttribute
我的网站对所有人开放,但我有一个控制器,它有一些方法,只有拥有用户和密码的经理才能进入。我将布尔值保存IsManager
在session
.
我想使用 authorize 属性来阻止 whoever IsManager == false
。
asp.net-mvc - 如何授权一组控制器而不在每个控制器上放置注释?
我有一组控制器,每个控制器都用于每种授权类型。例如,A 类授权将有一组控制器,每个控制器都需要 A 类授权。有没有办法在[Authorize(Role="Class A")]
某个地方放置一个属性,该属性将应用于每个控制器,而不必用相同的属性装饰每个控制器?