Azure WorkerRole OR Self Hosted应用程序中的Hangfire仪表板授权

时间:2016-01-13 12:44:14

标签: c# azure-worker-roles hangfire

最近我介绍了Hangfire,我必须说它很棒。

我正在开发一个应用程序,其中我在Azure worker角色中托管hangfire。 一切都很完美; hangfire配置,作业调度,仪表板等除了配置hangfire仪表板的授权

我添加了一个OwinStartup类,我在其中配置了hangfire控制台。我使用了IAuthorizationFilterOwinMiddleware的自定义实现,预计现在应该提示用户在访问hangfire控制台时提供凭据。但是没有任何帮助,它在尝试访问仪表板时不断给我403响应。 :(

如果我在配置仪表板时不使用授权过滤器选项,那么它的工作完全正常,但是每个人都可以访问它。

这是我的启动课程 -

    public void Configuration(IAppBuilder app)
    {
        app.UseWelcomePage("/");

        app.Use(typeof(AuthenticationMiddleware));

        app.UseHangfireDashboard("/hangfire", new DashboardOptions
        {
            AuthorizationFilters = new[] { new MyAuthorization() }
        });
    }

我已按照建议here

编写了OWIN中间件,即AuthenticationMiddleware

...和我的自定义IAuthorizationFilter

public class MyAuthorization : IAuthorizationFilter
{
     public bool Authorize(IDictionary<string, object> owinEnvironment)
     {
         var context = new OwinContext(owinEnvironment);

         // Allow all authenticated users to see the Dashboard 
         return context.Authentication.User.Identity.IsAuthenticated;
     }
}

这就是我在工作者角色的OnStart方法中配置仪表板的方法。 (ref

var endpoint = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["WorkerRoleEndpoint"];
string baseUri = String.Format("{0}://{1}", endpoint.Protocol, endpoint.IPEndpoint);//http://127.0.0.1:81/hangfire

owinApp = WebApp.Start<HangfireDashboardStartup>(new StartOptions(url: baseUri));

我想自托管应用程序中的hangfire控制台解决方案应该也可以正常工作

1 个答案:

答案 0 :(得分:1)

以下nuget包来解救基本身份验证 -

<强> Thinktecture.IdentityModel.Owin.BasicAuthentication

这里有包裹 - https://www.nuget.org/packages/Thinktecture.IdentityModel.Owin.BasicAuthentication/

获取此软件包,只需在 owin startup 类中调用以下内容,而不是自定义中间人 -

app.UseBasicAuthentication("SomeName", ValidateUser);

...其中ValidateUser是验证用户的函数。

    private Task<IEnumerable<Claim>> ValidateUser(string id, string secret)
    {
        if (id == secret) //Dummy validation, modify it accordingly
        {
            var claims = new List<Claim>
            {
                new Claim(ClaimTypes.NameIdentifier, id),
                new Claim(ClaimTypes.Role, "Foo")
            };
            return Task.FromResult<IEnumerable<Claim>>(claims);
        }
        return Task.FromResult<IEnumerable<Claim>>(null);
    }

你完成了!现在,当您访问hangfire仪表板时,系统将提示您输入凭据。