// В случае уже имеющегося разрешения на редактирование public bool CanMove(SunClaimsPrincipal user, CategoryCached categoryFrom, CategoryCached categoryTo) { // Если модератор с правом перемещения материалов на обе категории то разрешаем return(categoryTo.IsMaterialsContainer && authorizationService.HasAccess(user.Roles, categoryFrom, OperationKeys.MaterialWrite) && authorizationService.HasAccess(user.Roles, categoryTo, OperationKeys.MaterialWrite)); }
public async Task <bool> CanUpdateAsync(SunClaimsPrincipal user, Material material) { var operationKeys = authorizationService.HasAccess(user.Roles, material.CategoryId, new[] { OperationKeys.MaterialEditOwn, OperationKeys.MaterialEditOwnIfHasReplies, OperationKeys.MaterialEditOwnIfTimeNotExceeded, OperationKeys.MaterialEditAny }); // Если пользователь может редактировать любой материал, то пускаем if (operationKeys.Contains(OperationKeys.MaterialEditAny)) { return(true); } // Если это чужой материал, то запрещаем if (material.AuthorId != user.UserId) { return(false); } // Если MaterialEditOwnIfHasReplies заблокировано и есть чужие ответы то запрещаем if (!operationKeys.Contains(OperationKeys.MaterialEditOwnIfHasReplies)) { if (await CheckHasNotOwnRepliesAsync(material, user.UserId)) { return(false); } } // Если MaterialEditOwnIfTimeNotExceeded заблокировано и время редактирования истекло то блокируем if (!operationKeys.Contains(OperationKeys.MaterialEditOwnIfTimeNotExceeded)) { if (!EditOwnIfTimeNotExceededCheck(material.PublishDate)) { return(false); } } // Если MaterialEditOwn то разрешаем return(operationKeys.Contains(OperationKeys.MaterialEditOwn)); }
public async Task <bool> CanMoveToTrashAsync(SunClaimsPrincipal user, Comment comment, int categoryId) { var operationKeys = authorizationService.HasAccess(user.Roles, categoryId, new[] { OperationKeys.CommentDeleteOwn, OperationKeys.CommentDeleteAny, OperationKeys.CommentDeleteOwnIfHasReplies, OperationKeys.CommentDeleteOwnIfTimeNotExceeded }); // Если мы модератор с ключём CommentDeleteAny разрешаем if (operationKeys.Contains(OperationKeys.CommentDeleteAny)) { return(true); } // Если мы не автор, то блокируем if (user.UserId != comment.AuthorId) { return(false); } // Если CommentDeleteOwnIfHasReplies заблокировано и есть есть чужие ответы далее if (operationKeys.Contains(OperationKeys.CommentDeleteOwnIfHasReplies)) { if (await CheckHasNotOwnAfterAsync(comment)) { return(false); } } // Если CommentDeleteOwnIfTimeNotExceeded заблокировано и время редактирования истекло то блокируем if (!operationKeys.Contains(OperationKeys.CommentDeleteOwnIfTimeNotExceeded)) { if (!DeleteOwnIfTimeNotExceededCheck(comment.PublishDate)) { return(false); } } // Если CommentDeleteOwn то разрешаем return(operationKeys.Contains(OperationKeys.CommentDeleteOwn)); }
public bool CanEdit(SunClaimsPrincipal user, Material material) { return(CanUpdateAsync(user, material).GetAwaiter().GetResult()); }
protected override async Task <AuthenticateResult> HandleAuthenticateAsync() { AuthenticateResult ErrorAuthorization() { jwtService.MakeLogoutCookiesAndHeaders(Response); return(AuthenticateResult.NoResult()); } try { var cookie = Request.Cookies[TokenClaimNames.LongToken2CoockiName]; if (cookie == null) { return(AuthenticateResult.NoResult()); } JwtSecurityToken jwtLongToken2 = jwtService.ReadLongToken2(cookie); if (jwtLongToken2 == null) { return(ErrorAuthorization()); } var longToken2db = jwtLongToken2.Claims.First(x => x.Type == TokenClaimNames.LongToken2Db).Value; SunClaimsPrincipal sunClaimsPrincipal; if (Request.Headers.ContainsKey(Headers.LongToken1HeaderName)) { string longToken1db = Request.Headers[Headers.LongToken1HeaderName]; int userId = int.Parse(jwtLongToken2.Claims.First(x => x.Type == ClaimTypes.NameIdentifier).Value); var longSessionToFind = new LongSession { UserId = userId, LongToken1 = longToken1db, LongToken2 = longToken2db }; var longSession = userManager.FindLongSession(longSessionToFind); if (longSession == null) { return(ErrorAuthorization()); } sunClaimsPrincipal = await jwtService.RenewSecurityTokensAsync(Response, userId, longSession); Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine("\nToken renews\n"); Console.ResetColor(); } else { string authorization = Request.Headers["Authorization"]; if (string.IsNullOrEmpty(authorization)) { return(AuthenticateResult.NoResult()); } string jwtShortToken = null; if (authorization.StartsWith("Bearer ", StringComparison.OrdinalIgnoreCase)) { jwtShortToken = authorization.Substring("Bearer ".Length).Trim(); } if (string.IsNullOrEmpty(jwtShortToken)) { return(AuthenticateResult.NoResult()); } var claimsPrincipal = jwtService.ReadShortToken(jwtShortToken, out SecurityToken shortToken); string lat2ran_1 = jwtLongToken2.Claims.FirstOrDefault(x => x.Type == TokenClaimNames.LongToken2Ran).Value; string lat2ran_2 = claimsPrincipal.Claims.FirstOrDefault(x => x.Type == TokenClaimNames.LongToken2Ran).Value; if (!string.Equals(lat2ran_1, lat2ran_2)) { return(ErrorAuthorization()); } long sessionId = long.Parse(jwtLongToken2.Claims.FirstOrDefault(x => x.Type == TokenClaimNames.SessionId).Value); string lat2db = jwtLongToken2.Claims.FirstOrDefault(x => x.Type == TokenClaimNames.LongToken2Db).Value; sunClaimsPrincipal = new SunClaimsPrincipal(claimsPrincipal, rolesCache, sessionId, lat2db); } if (jwtBlackListService.IsTokenNotInBlackList(sunClaimsPrincipal.LongToken2Db)) { return(ErrorAuthorization()); } if (sunClaimsPrincipal.Roles.ContainsKey(RoleNames.Banned)) { return(ErrorAuthorization()); } var authenticationTicket = new AuthenticationTicket(sunClaimsPrincipal, SunJwt.Scheme); return(AuthenticateResult.Success(authenticationTicket)); } catch (Exception e) { return(ErrorAuthorization()); } }