首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IAuthorizationFilter不是每次都打电话

IAuthorizationFilter不是每次都打电话
EN

Stack Overflow用户
提问于 2016-04-22 08:47:04
回答 2查看 7.9K关注 0票数 1

我们使用IAuthorizationFilter类过滤所有请求,并检查身份验证cookie中是否仍然存在自定义用户声明(多租户应用程序)。这些信息是应用程序其余部分的基本信息。如果这些信息不存在,我们将重定向到登录页。

代码语言:javascript
复制
    public class TokenAuthorizationFilter : IAuthorizationFilter, IAsyncAuthorizationFilter
    {

        public TokenAuthorizationFilter()
        {
            // Some dependency injection ...
        }

        public void OnAuthorization(Microsoft.AspNet.Mvc.Filters.AuthorizationContext context)
        {
            CheckToken(context);
        }

        public Task OnAuthorizationAsync(Microsoft.AspNet.Mvc.Filters.AuthorizationContext context)
        {
            return CheckToken(context);
        }
}

我们这样注册我们的过滤器

代码语言:javascript
复制
    services.AddMvc(config =>
    {
        config.Filters.Add(typeof(TokenAuthorizationFilter));
    });

我想要访问的控制器的操作非常简单:

代码语言:javascript
复制
[Authorize(Policy = "TokenValid")]
public class HomeController : AjaxBaseController
{
    public IActionResult Index()
    {
        return View();
    }
}

我们甚至没有达到我们的AuthorizeAttribute政策。正如我在堆栈跟踪中所看到的,在检查了一个Microsoft.AspNet.Identity.SignInManager之后,标识正在试图在中间件中的某个地方创建一个CookieAuthenticationOptions,我假设他试图重新登录用户,但它没有检查我的筛选器?登录在我们的应用程序中是非常特殊的,所以我不想让身份日志自动记录我们的用户。当身份验证cookie过期时,我可以复制此问题。有什么想法吗?谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-07 07:09:13

最后我发现了这个问题。每隔30分钟,标识就会试图通过SecurityStamp验证来验证用户,这使得应用程序崩溃,因为它需要一个在验证时不存在的数据库连接。通过重新实现OnValidatePrincipal,我们在启动时取消了此验证:

代码语言:javascript
复制
options.Cookies.ApplicationCookie.Events = new CookieAuthenticationEvents { OnValidatePrincipal = (context) => Task.FromResult(0) };
票数 1
EN

Stack Overflow用户

发布于 2016-07-06 15:29:14

还需要使TokenAuthorizationFilterAuthorizeAttribute继承授权筛选器,并将其重命名为TokenAuthorizationFilterAttribute。这将成为您可以使用[TokenAuthorizationFilter]调用的一个属性。

代码语言:javascript
复制
[TokenAuthorizationFilter]
public class HomeController : AjaxBaseController
{
    public IActionResult Index()
    {
        return View();
    }
}

在实现IAuthorizationFilter和IAsyncAuthorizationFilter时要小心,因为ASP.NET核心在本例中只调用异步方法:如果不需要任何异步调用,那么只实现IAuthorizationFilter接口。

此外,如果您一直像这样注册过滤器:

代码语言:javascript
复制
services.AddMvc(config =>
{
    config.Filters.Add(typeof(TokenAuthorizationFilter));
});

您将注意到,每个操作都将调用筛选器,因为它将强制每次调用授权筛选器,因此在这种情况下,不需要在操作顶部添加属性。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36789140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档