【问题标题】:Hangfire aspnetcore2 default authentication challenge not workingHangfire aspnetcore2 默认身份验证质询不起作用
【发布时间】:2018-06-19 06:11:41
【问题描述】:

使用 hangfire 版本:1.6.17
我已在 aspnetcore 2.0
上成功设置 hangifire 我通过使用添加了授权:

app.UseHangfireDashboard("/jobs", new DashboardOptions
{
    Authorization = new[] { new HangfireAuthorizationFilter() }
});

public class HangfireAuthorizationFilter :IDashboardAuthorizationFilter
{
    private const string PERMISSION = "read:jobs";
    public bool Authorize(DashboardContext context)
    {
        var httpContext = context.GetHttpContext();
        // allow only users with correct permission
        if (httpContext.User.Identity.IsAuthenticated)
        {
            var permissions = httpContext.User.Claims.FirstOrDefault(x => x.Type.Equals(CustomClaims.Permissions))?.Value?.Split(' ');
            return permissions?.Contains(PERMISSION) ?? false;
        }
        return false;
    }
}

我无法解决的唯一问题是向用户返回了一个带有 401 的空白屏幕,而不是默认的挑战 /account/login。

如果您使用 [Authorize] 属性访问我的控制器,它们会自动重定向到 /account/login,因此登录路径正常工作。

即使我特别指定,用户在未经授权访问 Hangfire 时也不会被重定向:

services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})
 .AddCookie(options =>
 {
     options.LoginPath = "/Account/Login/";
 })

有人提出想法,或者我应该将其标记为 Hangfire github 上的错误。

【问题讨论】:

  • 您好,您找到解决方法了吗?
  • 不,但我通过重定向到登录页面并在查询字符串中自己指定重定向 URL 来解决问题。不是一个体面的工作,但没有其他选择,因为我没有得到任何反馈。

标签: asp.net-core authorization openid-connect hangfire


【解决方案1】:

首先你应该添加 HangFireAuthorizationFilter

    public sealed class HangFireAuthorizationFilter : IDashboardAuthorizationFilter
{
    private readonly IAuthorizationService _authorizationService;
    private readonly IHttpContextAccessor _httpContextAccessor;
    public HangFireAuthorizationFilter(IAuthorizationService authorizationService,
    IHttpContextAccessor httpContextAccessor)
    {
        _authorizationService = authorizationService;
        _httpContextAccessor = httpContextAccessor;
    }
    public bool Authorize([NotNull] DashboardContext context)
    {
        var httpContext = context.GetHttpContext();
        return httpContext.User.Identity.IsAuthenticated;
    }
}

然后在启动时使用下面的:

    var hangFireAuth = new DashboardOptions
        {
            Authorization = new[]
            {
            new HangFireAuthorizationFilter(app.ApplicationServices.GetService<IAuthorizationService>(),
            app.ApplicationServices.GetService<IHttpContextAccessor>())
            },
            AppPath = "/login"
        };
        app.UseHangfireDashboard("/hangfire", options: hangFireAuth);

更多详情可参考以下https://medium.com/ricos-note/hangfire-dashboard-of-authorization-b41d7135b044

【讨论】:

    猜你喜欢
    • 2021-12-04
    • 2021-04-01
    • 2020-02-06
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 1970-01-01
    • 2012-10-04
    相关资源
    最近更新 更多