| using System.Threading.Tasks; |
| using ContactManagementAPI.Models; |
| using ContactManagementAPI.Services; |
| using Microsoft.AspNetCore.Mvc; |
| using Microsoft.AspNetCore.Mvc.Filters; |
|
|
| namespace ContactManagementAPI.Security |
| { |
| public class RequireRightAttribute : TypeFilterAttribute |
| { |
| public RequireRightAttribute(string rightKey) : base(typeof(RequireRightFilter)) |
| { |
| Arguments = new object[] { rightKey }; |
| } |
| } |
|
|
| public class RequireRightFilter : IAsyncActionFilter |
| { |
| private readonly string _rightKey; |
| private readonly UserContextService _userContext; |
| private readonly AuthorizationService _authorizationService; |
|
|
| public RequireRightFilter(string rightKey, UserContextService userContext, AuthorizationService authorizationService) |
| { |
| _rightKey = rightKey; |
| _userContext = userContext; |
| _authorizationService = authorizationService; |
| } |
|
|
| public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) |
| { |
| if (!_userContext.UserId.HasValue) |
| { |
| var returnUrl = context.HttpContext.Request.Path + context.HttpContext.Request.QueryString; |
| context.Result = new RedirectToActionResult("Login", "Account", new { returnUrl }); |
| return; |
| } |
|
|
| var hasRight = _authorizationService.HasRight(_userContext.UserId.Value, _rightKey); |
| if (!hasRight) |
| { |
| context.Result = new RedirectToActionResult("AccessDenied", "Account", null); |
| return; |
| } |
|
|
| await next(); |
| } |
| } |
| } |
|
|