Каков наилучший способ узнать пользователя, который является журналом?

#c# #asp.net-core-mvc #entity-framework-core

#c# #asp.net-core-mvc #сущность-фреймворк-ядро

Вопрос:

Привет, у меня следующая проблема с дизайном:

Перед доступом к моему контроллеру у меня есть фильтр для проверки подлинности и авторизации, поэтому для этого я должен знать пользователя. Пока все не будет идеально, но проблема начинается, когда я хочу узнать пользователя, который ведет журнал, чтобы я мог делать больше вещей. Есть идеи?

 [AdministratorAuth("DogController")] 
public class DogController : ControllerBase
{    
   [HttpGet]
   public IAction GetDogsOfUser()
   {
       return Ok(dogLogic.GetDogsOfUser());
   }
}
  
 public class LoginAuth : Attribute, IActionFilter
    {
        public static Guid Token { get; private set; }

        public void OnActionExecuted(ActionExecutedContext context)
        {

        }

        public void OnActionExecuting(ActionExecutingContext context)
        {
            string headerToken = context.HttpContext.Request.Headers["Authorization"];

            if (headerToken is null) 
            {
                context.Result = new ContentResult()
                {
                    Content = "Token is required",
                };
            } else 
            {
                try 
                {
                    Guid token = Guid.Parse(headerToken);
                    VerifyToken(token, context);
                    Token = token;
                } catch (FormatException) 
                {
                    context.Result = new ContentResult()
                    {
                        Content = "Invalid Token format",
                    };
                }
            }
        }

        private void VerifyToken(Guid token, ActionExecutingContext context)
        {
            using (var sessions = GetSessionLogic(context)) 
            {
                if (!sessions.IsValidToken(token)) 
                {
                    context.Result = new ContentResult()
                    {
                        Content = "Invalid Token",
                    };
                }
            }
        }

        private ISessionLogic GetSessionLogic(ActionExecutingContext context) 
        {
            var typeOfSessionsLogic = typeof(ISessionLogic);
            return context.HttpContext.RequestServices.GetService(typeOfSessionsLogic) as ISessionLogic;
        }
    }
  
 public class AdministratorAuth : LoginAuth
    {
        private readonly string permission;

        public AdministratorAuth(string permission)
        {
            this.permission = permission;
        }

        public void OnActionExecuted(ActionExecutedContext context)
        {

        }

        public void OnActionExecuting(ActionExecutingContext context)
        {
            base.OnActionExecuting(context);
            string headerToken = context.HttpContext.Request.Headers["Authorization"];
            Guid token = Guid.Parse(headerToken);

            using (var sessions = GetSessionLogic(context)) 
            {
                if (!sessions.HasLevel(token, permission)) 
                {
                    context.Result = new ContentResult()
                    {
                        Content = "The user hasn't the permission to access "   permission,
                    };   
                }
            }
        }

        private ISessionLogic GetSessionLogic(ActionExecutingContext context) 
        {
            var typeOfSessionsLogic = typeof(ISessionLogic);
            return context.HttpContext.RequestServices.GetService(typeOfSessionsLogic) as ISessionLogic;
        }
    }
  

Итак, давайте представим, что у меня есть это, если я хочу узнать имена пользователей, которые являются журналом, как я могу это сделать?

Комментарии:

1. Это зависит от реализации AdministratorAuthAttribute . Это не похоже на стандартный готовый атрибут MVC.

2. Я редактирую вопрос, чтобы вы могли видеть мой класс фильтра AdministratorAuth и мой LoginAuth

3. Зачем вы делаете всю эту дополнительную работу, когда Identity делает все это за вас?

4. Что вы имеете в виду?

5. то, что вы написали выше, уже реализовано в ASP.Net Базовая авторизация , взгляните на авторизацию на основе утверждений или на основе политик .

Ответ №1:

Вы можете просто использовать функцию Nlog или log4net,

или

создайте модель, которая содержит

 Logged = DateTime.Now,
LoginHost = Request.Host.ToString(),
LoginIP = Request.HttpContext.Connection.LocalIpAddress.ToString(),
SessionId = Request.HttpContext.Session.Id
  

Комментарии:

1. Не могли бы вы более конкретно показать и помочь мне в том, как реализовать правильное решение для этого примера? Я хочу знать журнал пользователя в классе DogLogic, потому что у меня там есть логика

2. @ Daniel Acevedo, это зависит от вашей аутентификации, например, если вы используете asp.net идентификатор вы можете получить доступ к значению утверждений и получить много информации о журнале пользователя: HttpContextAccessor. HttpContext.User.Claims, это зависит от вашей аутентификации

3. Я редактирую вопросы, чтобы вы могли видеть. Я понимаю, что вы говорите, но я не думаю, что это совершенно правильно делать то, что вы говорите в DogController