我的应用程序是在 ASP.Net Core 5 上运行的 Angular 12 应用程序。
我目前正在尝试锁定 Hangfire,以便它仅适用于具有管理员角色的人。
它使用 Microsoft 身份登录 - 特别是在 Azure 中设置的单点登录。
public void ConfigureServices(IServiceCollection services)
{
...
services.AddHangfire(x =>
{
x.UseSqlServerStorage(sqlServerConnectionString);
});
...
services
.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(Configuration);
...
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
...
app.UseAuthentication();
app.UseRouting();
app.UseAuthorization();
app.UseHangfireDashboard("/hangfire", new DashboardOptions
{
Authorization = new[] {
new HangfireAuthorisationFilter()
},
AppPath = "/"
});
...
app.UseEndpoints(endpoints => {
...
});
app.UseSpa(spa=>{
...
});
}
这适用于我的点网核心控制器。
我需要做的就是添加 Authorize 属性:
namespace MyAppName.Controllers
{
[Produces("application/json")]
[Route("api/MyRoute")]
[Authorize(Roles="Role1,Role2,Administrator")]
public class MyControllerController: MyBaseApiController
{
...
}
}
但是当我想在 Hangfire 中进行授权时,用户对象缺少很多属性。
这是 HangfireAuthorisationFilter:
public class HangfireAuthorisationFilter : IDashboardAuthorizationFilter
{
public HangfireAuthorisationFilter()
{
}
public bool Authorize(DashboardContext context)
{
var httpContext = context.GetHttpContext();
// the next line always fails. The User object is set. The Identity object is set
// but there are no claims and the User.Name is null. There are also no roles set.
return httpContext.User.Identity.IsAuthenticated;
}
}
但是,有 cookie 信息,其中包含 msal cookie:
如何将身份验证信息传递给 Hangfire Authorize 方法?如何访问角色信息,以便将其锁定为仅管理员角色?有没有办法可以在服务器端解码 msal cookie?