使用 Hangfire 仪表板时使用会话进行身份验证

Authentication with session when using Hangfire dashboard

我想使用会话 属性(会话["isAdmin"])来确定用户是否应该能够查看 Hangfire 仪表板。

问题是当我使用

HttpContext.Current.Session

这是空的 - 尽管我在我的其他页面上使用这个 属性 其中有数据。
我正在努力遵循代码片段。
我想让管理员角色查看页面。

public class AuthorizationFilter : IDashboardAuthorizationFilter
    {
        public bool Authorize(DashboardContext context)
        {
            var session = HttpContext.Current.Session;

            if (session == null || 
                session["username"] == null ||
                FindUserRole(session["username"].ToString()) != 
                 "ADMIN")
            {
                return false;
            }
            return true;
        }
    }

有没有其他方法可以让我更轻松地做到这一点?

要获取上下文,您应该使用提供的参数。像这样的东西应该是你所追求的:

    public class HangfireAuthorization : IDashboardAuthorizationFilter
    {
        public bool Authorize([NotNull] DashboardContext currentContext)
        {
           return Boolean.Parse(currentContext.GetHttpContext().Session.GetString("isAdmin"));
        }
    }

你可以这样使用。不要忘记会话的到期时间有限。

public class HangfireAuthorizationFilter : IDashboardAuthorizationFilter
{
    public object session;

    public bool Authorize(DashboardContext context)
    {
        var sessionToCheck = System.Web.HttpContext.Current.Session?[YourSessionKeyHere];

        if (sessionToCheck != null)
        {
            session= sessionToCheck;

            return true;
        }
        else if (session != null)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}

已接受的答案适用于 .NET Core,但如果您使用的是 .NET Framework,则 GetHttpContext() 不存在。我确实从这个 GitHub 问题中找到了一个有效的答案:

https://github.com/HangfireIO/Hangfire/issues/978

如果您注册 IHttpModule 并将会话状态设置为必需

context.SetSessionStateBehavior(SessionStateBehavior.Required);

那么,HttpContext.Current.SessionHangfireAuthorizationFilter

中不会为空