In my ASP.NET Core MVC app, I have a class that inherits from AuthorizeAttribute and implements IAuthorizationFilter.
namespace MyProject.Attributes
{
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class AllowGroupsAttribute : AuthorizeAttribute, IAuthorizationFilter
{
private readonly List<PermissionGroups> groupList = null;
public AllowGroupsAttribute(params PermissionGroups[] groups)
{
groupList = groups.ToList();
}
public void OnAuthorization(AuthorizationFilterContext context)
{
var executingUser = context.HttpContext.User;
//If the user is not authenticated then prevent execution
if (!executingUser.Identity.IsAuthenticated)
{
context.Result = new StatusCodeResult((int)System.Net.HttpStatusCode.Forbidden);
}
}
}
}
This allows me to decorate a controller method with something like [AllowGroups(PermissionGroups.Admin, PermissionGroups.Level1]
What I plan to do, is retreive group names from appsettings.json based on the enum values listed and check that the user is a member of those groups.
My question is, what is the correct way to access the app settings from within my attribute class?
Configure settings on startup,
Either via options
services.Configure<MySettings>(Configuration.GetSection("groups"));
Or concrete object model
MySettings settings = Configuration.GetSection("groups").Get<MySettings>();
services.AddSingleton(settings);
And then resolve them through the HttpContext.RequestServices
within the filter
var services = context.HttpContext.RequestServices;
var settings = services.GetService<MySettings>();
//-- OR --
//var settings = services.GetService<IOptions<MySettings>>().Value;
//...
while a more service locator approach, it should allow for access to the desired configuration.
I had the same problem and so you solve it
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class AllowGroupsAttribute : AuthorizeAttribute, IAuthorizationFilter
{
IConfigurationBuilder builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
IConfigurationRoot configuration = builder.Build();
var user = configuration.GetSection("AppConfig").GetSection("user").Value;
var pass = configuration.GetSection("AppConfig").GetSection("pass").Value;
..........
}
in appsettings.json
"AppConfig": {
"user": "hola",
"pass": "mundo"
},
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.