#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