예제 #1
0
 // В случае уже имеющегося разрешения на редактирование
 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));
 }
예제 #2
0
        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));
        }
예제 #3
0
        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));
        }
예제 #4
0
 public bool CanEdit(SunClaimsPrincipal user, Material material)
 {
     return(CanUpdateAsync(user, material).GetAwaiter().GetResult());
 }
예제 #5
0
        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());
            }
        }