C# 如果asp.net mvc5应用程序中的hangfire授权失败,则重定向到错误页面

C# 如果asp.net mvc5应用程序中的hangfire授权失败,则重定向到错误页面,c#,asp.net-mvc,hangfire,C#,Asp.net Mvc,Hangfire,我们可以将试图浏览hangfire url的用户重定向到未经授权的页面吗。 我正在使用ASP.NETMVC5。 我的startup.cs文件中有以下页面 public void Configuration(IAppBuilder app) { String conn = System.Configuration.ConfigurationManager. ConnectionStrings["conn"].ConnectionString;

我们可以将试图浏览hangfire url的用户重定向到未经授权的页面吗。 我正在使用ASP.NETMVC5。 我的startup.cs文件中有以下页面

 public void Configuration(IAppBuilder app)
        {
            String conn = System.Configuration.ConfigurationManager.
    ConnectionStrings["conn"].ConnectionString;
            // For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=316888
            GlobalConfiguration.Configuration
               .UseSqlServerStorage(conn,
               new SqlServerStorageOptions { QueuePollInterval = TimeSpan.FromSeconds(1) });

            //BackgroundJob.Enqueue(() => Console.WriteLine("Fire-and-forget!"));

            //app.UseHangfireDashboard();

            app.UseHangfireDashboard("/Admin/hangfire", new DashboardOptions
            {
                Authorization =new[] { new DashboardAuthorizationFilter() }
            });
            //app.MapHangfireDashboard("/hangfire", new[] { new AuthorizationFilter() });
            app.UseHangfireServer();
            //start hangfire recurring jobs
            HangFireServices service = new HangFireServices();
            //service.StartArchive();
            service.StartDelete();
        }
消防服务部的工作如下:

public void StartDelete()
        {
            List<KeyValuePair<string, int>> c = _service.GetServiceRetention();

            foreach (var obj in c)
            {
                  RecurringJob.AddOrUpdate(DELETE_SERVICE + obj.Key, () =>
                  Delete(obj.Key), //this is my function that does the actual process
               Cron.DayInterval(Convert.ToInt32(obj.Value)));
            }
        }

默认页面是在其上设置不同授权类的主页。根据db,用户未通过授权规则,并被重定向到UnAuthorizedController索引页。如果用户手动将url更改为指向/hangfire,因为返回的授权为false,它会看到一个空白页面,但我想重定向到UnAuthorizedController索引页面。

如果您想重定向到controller上的特定页面,那么这可能会有所帮助

我使用登录方法创建了一个帐户控制器,如下所示:

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Login(LoginViewModel model, string returnUrl = "jobs")
    {
        if (!ModelState.IsValid)
        {
            return View(model);
        }

            var user = await UserManager.FindByNameAsync(model.UserName);

            await SignInManager.SignInAsync(user, false, false);        

            var virtualDirectory = Request.ApplicationPath.Equals("/") ? "/" : Request.ApplicationPath + "/";       

            return Redirect(virtualDirectory + returnUrl);
        }

        ModelState.AddModelError("", "Invalid login attempt.");
        return View(model);
    }

当您未通过身份验证时,您将被重定向到帐户控制器上的登录操作。

如果您想重定向到控制器上的特定页面,则这可能会有所帮助

我使用登录方法创建了一个帐户控制器,如下所示:

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Login(LoginViewModel model, string returnUrl = "jobs")
    {
        if (!ModelState.IsValid)
        {
            return View(model);
        }

            var user = await UserManager.FindByNameAsync(model.UserName);

            await SignInManager.SignInAsync(user, false, false);        

            var virtualDirectory = Request.ApplicationPath.Equals("/") ? "/" : Request.ApplicationPath + "/";       

            return Redirect(virtualDirectory + returnUrl);
        }

        ModelState.AddModelError("", "Invalid login attempt.");
        return View(model);
    }

当您未通过身份验证时,您将被重定向到account controller上的登录操作。

如果错误页面表示静态内容,则很简单:

public class HangfireAuthorizationFilter : IDashboardAuthorizationFilter
{
    public bool Authorize([NotNull] DashboardContext context)
    {
        var path = context.GetHttpContext().Request.Path;
        var isResource = path != null && (path.Value.StartsWith("/css") || path.Value.StartsWith("/js") || path.Value.StartsWith("/font"));
        if (!context.GetHttpContext().User.Identity.IsAuthenticated && !isResource)
        {
            context.Response.ContentType = "text/html";
            context.Response.WriteAsync(new AccessDeniedPage().ToString(context.GetHttpContext()));
            return false;
        }
        return true;
    }
}
请注意,此AccessDeniedPage不是从Hangfire.Dashboard.RazorPage继承的。原因是您将无法为此类页面分配当前上下文Hangfire已将其某些功能设置为内部功能。但是,如果您需要从Microsoft.AspNetCore.Mvc.Razor.RazorPage继承,它将类似于:

context.Response.WriteAsync(new AccessDeniedPage().ToString(context.GetHttpContext()));
ToString的位置是:


如果错误页面表示静态内容-很简单:

public class HangfireAuthorizationFilter : IDashboardAuthorizationFilter
{
    public bool Authorize([NotNull] DashboardContext context)
    {
        var path = context.GetHttpContext().Request.Path;
        var isResource = path != null && (path.Value.StartsWith("/css") || path.Value.StartsWith("/js") || path.Value.StartsWith("/font"));
        if (!context.GetHttpContext().User.Identity.IsAuthenticated && !isResource)
        {
            context.Response.ContentType = "text/html";
            context.Response.WriteAsync(new AccessDeniedPage().ToString(context.GetHttpContext()));
            return false;
        }
        return true;
    }
}
请注意,此AccessDeniedPage不是从Hangfire.Dashboard.RazorPage继承的。原因是您将无法为此类页面分配当前上下文Hangfire已将其某些功能设置为内部功能。但是,如果您需要从Microsoft.AspNetCore.Mvc.Razor.RazorPage继承,它将类似于:

context.Response.WriteAsync(new AccessDeniedPage().ToString(context.GetHttpContext()));
ToString的位置是:


只是想澄清一下,您是希望用户始终看到401页面,还是仅当他们无法登录到Hangfire UI时才看到?仅当用户无法进行授权时,我才希望显示401页面或某些自定义错误页面。我已使用web.config httpError条目尝试了这一点,而Hangfire似乎出于某种原因忽略了这一点,即使登录失败也是如此。希望其他人知道如何拦截!只是想澄清一下,您是希望用户始终看到401页面,还是仅当他们无法登录到Hangfire UI时才看到?仅当用户无法进行授权时,我才希望显示401页面或某些自定义错误页面。我已使用web.config httpError条目尝试了这一点,而Hangfire似乎出于某种原因忽略了这一点,即使登录失败也是如此。希望其他人知道如何拦截!
public abstract class PageBase : RazorPage
{
    public UrlHelper Url { get; set; }

    public override async Task ExecuteAsync()
    {
        await Task.CompletedTask;
    }

    public abstract void Execute();

    public string ToString(HttpContext httpContext)
    {
        using var output = new StringWriter();
        ViewContext = new Microsoft.AspNetCore.Mvc.Rendering.ViewContext()
        {
            HttpContext = httpContext,
            Writer = output
        };
        HtmlEncoder = HtmlEncoder.Default;
        Url = new UrlHelper(new ActionContext
        {
           HttpContext = httpContext,
           ActionDescriptor = new ActionDescriptor(),
           RouteData = new RouteData()
        });
        Execute();
        return output.ToString();
    }