- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
当我创建一个新的 asp.net mvc 4.0 应用程序时,我做的第一件事 就是创建并设置自定义授权全局过滤器
,如下所示:
//FilterConfig.cs
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
//filters.Add(new HandleErrorAttribute());
filters.Add(new CustomAuthorizationAttribute());
}
然后我像这样创建 CustomAuthorizationAttribute
:
//CustomAuthorizationAttribute.cs
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
//Handle AJAX requests
filterContext.HttpContext.Response.StatusCode = 403;
filterContext.Result = new JsonResult { JsonRequestBehavior = JsonRequestBehavior.AllowGet };
}
else
{
//Handle regular requests
base.HandleUnauthorizedRequest(filterContext); //let FormsAuthentication make the redirect based on the loginUrl defined in the web.config (if any)
}
}
我有两个 Controller :HomeController
和 SecureController
HomeController 用 [AllowAnonymous]
属性修饰。
SecureController 没有用[AllowAnonymous]
属性修饰。
HomeController
的 Index() ActionResult
显示一个带有简单按钮的 View 。
当我点击按钮时,我对 SecureController
中的 GetData() 方法进行了 ajax 调用,如下所示:
$("#btnButton").click(function () {
$.ajax({
url: '@Url.Action("GetData", "Secure")',
type: 'get',
data: {param: "test"},
success: function (data, textStatus, xhr) {
console.log("SUCCESS GET");
}
});
});
不用说,当我点击按钮时,我触发了 CustomAuthorizationAttribute
因为它是一个全局过滤器而且因为 SecureController
没有用 装饰[AllowAnonymous]
属性。
好的,我的介绍结束了......
随着 asp.net mvc 5.0
的引入,我们现在引入了一个新的authentication filter
,它恰好在 之前授权过滤器(这很棒,让我们可以更精细地控制我如何区分未通过身份验证的用户 (http 401) 与经过身份验证但碰巧未被授权的用户 (http 403))。
为了试用这个新的身份验证过滤器
,我创建了一个新的 asp.net mvc 5.0(VS Express 2013 for Web)并开始执行以下操作:
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
//filters.Add(new HandleErrorAttribute());
filters.Add(new CustomAuthenticationAttribute()); //Notice I'm using the word Authentication and not Authorization
}
然后是属性:
public class CustomAuthenticationAttribute : ActionFilterAttribute, IAuthenticationFilter
{
public void OnAuthentication(AuthenticationContext filterContext)
{
}
public void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext)
{
var user = filterContext.HttpContext.User;
if (user == null || !user.Identity.IsAuthenticated)
{
filterContext.Result = new HttpUnauthorizedResult();
}
}
}
我创建了一个 HomeController
。 HomeController
用 [AllowAnonymous]
属性修饰。
在从 VS 2013 启动应用程序之前,我在 CustomAuthenticationAttribute 的两个方法(OnAuthentication
和 OnAuthenticationChallenge
)中设置了两个断点。
当我启动应用程序时,我遇到了第一个断点 (OnAuthentication
)。然后,令我惊讶的是,我的 HomeController
的 Index() ActionResult
中的代码 被执行 并且只有在我返回 View() 之后我在 OnAuthenticationChallenge()
方法上遇到了断点。
问题:我有两个问题。
问题1)
我的印象是 [AllowAnonymous]
属性会自动绕过我的 CustomAuthenticationAttribute
中的任何代码,但我错了!我是否需要手动检查 [AllowAnonymous]
属性并跳过任何代码?
问题 2)为什么我的 HomeController
的 Index()
方法中的代码在 OnAuthentication
之后执行?才意识到在我返回 View() 之后 OnAuthenticationChallenge()
中的代码是否被执行了?
我担心的是,如果用户未通过身份验证,我不希望执行 Index()
方法中的代码。
也许我看错了。
如果有人能帮助我阐明这一点,那就太好了!
真诚的文斯
最佳答案
在回答问题 1 时:
[AllowAnnoymous] 属性就像一个标志(它实际上没有实现逻辑)。它的存在仅在执行 OnAuthorization 期间由 [Authorize] 属性检查。反编译 [Authorize] 属性揭示了逻辑:
bool skipAuthorization = filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit: true)
|| filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit: true);
if (skipAuthorization)
{
return;
}
[AllowAnnonymous] 永远不会“自动”绕过您自定义属性中的代码...
所以问题 1 的后半部分的答案是:是的 - 如果您希望您的自定义属性对 [AllowAnnonymous] 的存在使用react,那么您需要为自定义 [Authorize] 属性中的 [AllowAnnonymous] 属性。
关于c# - MVC 5.0 [AllowAnonymous] 和新的 IAuthenticationFilter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19551113/
我在我的 asp.net web api 中设置了一个客户授权属性 全局文件: FilterConfig.RegisterHttpFilters(GlobalConfiguration.Confi
一切正常,直到我安装(包管理器控制台)邮政包,然后卸载并安装旧版本。 现在我得到了一个以前没有的错误。错误: 找不到类型或命名空间名称“AllowAnonymous”(是否缺少 using 指令或程序
AllowAnonymous 和OverrideAuthorizeAttribute 的使用有什么区别。一样吗? 最佳答案 http://www.asp.net/web-api/overview/se
我想了解 [AllowAnonymous] 标签的工作原理。 我有以下方法 [HttpGet] public ActionResult Add() { return View(); } 当我没
我正在使用自定义过滤器(定义如下): if (user == null || !user.Active) { filterContext.Res
我试图阻止特定角色(比如 RoleA)中的特定用户访问特定操作。允许匿名用户访问,但不允许 RoleA 中的用户访问该操作。 所以我做了这样的事情: [AllowAnonymous] [CustomA
我正在尝试为我的服务器设置自己的自定义身份验证。但是它会为每个端点调用,即使它在方法上具有 [AllowAnonymous] 属性也是如此。使用我当前的代码,我每次都可以在 HandleAuthent
我有一个 CustomApiAuthorizeAttribute: public class CustomApiAuthorizeAttribute : AuthorizeAttribute {
我已经创建了一个 Blazor WebAssembly 项目,并希望提供一个具有一个公共(public)可用函数的 WebAPI。 [Route("api/[controller]")] [ApiCo
我有一个建立在 Umbraco 上的整个网站,需要限制对所有页面的访问。唯一的异常(exception)是登陆页面和注销确认页面。 要将访问限制为仅登录用户,我在 web.config 中有以下内容:
使用 .Net 框架,Web Api。 我的 Controller 上有 [Authorize] 属性,某些端点上有 [AllowAnonymous]。 我有几个允许匿名的端点,但如果用户通过身份验证
当我应用这段代码时授权 Controller 方法和 AllowAnonymous在里面的一种操作方法上,所有操作方法都将被授权,除了上面有 AllowAnonymous 元数据的方法。显然,操作方法
我有一个 Asp.net MVC 应用程序,我在其中使用 Azure AD 身份验证对用户进行身份验证。我想允许用户在不登录的情况下访问一些 api Controller 。我尝试将 [AllowAn
在我的 .NET MVC 4 中,我添加了一个全局过滤器以保护我的 Controller 。 这是使用以下方法完成的: public static void RegisterGlobalFilters
这让我困惑了一段时间。显然,常见的类似情况似乎都不适用。我可能错过了一些明显的东西,但我看不到它。 在我的 Mvc Web 应用程序中,我使用 Authorize 和 AllowAnonymous 属
我有两个 MVC 5 应用程序,据我所知,它们都是相同的(一个是从另一个创建的)。然而,其中一个 AllowAnonymous 不起作用。 如果我在 FilterConfig 中注册 filters.
我正在使用 Web API Controller 构建 Web 服务。但是,当我尝试使用 [allowanonymous] 属性装饰我的任何操作时,它不起作用......这是一张图片 我只是想知道这里
当我创建一个新的 asp.net mvc 4.0 应用程序时,我做的第一件事 就是创建并设置自定义授权全局过滤器,如下所示: //FilterConfig.cs public static void
我通过继承 DelegatingHandler 实现了基于 JWT 的身份验证并将类添加为 configuration.MessageHandlers.Add(new MyDelegatingHand
我想使用 AllowAnonymous 和自定义 AuthenticationFilter。有人可以指出我使用 AllowAnonymous 或其他替代方法的正确方向吗?谢谢 我创建了自己的自定义过滤
我是一名优秀的程序员,十分优秀!