Я бы хотел реализовать свой собственный уровень аутентификации, но я не уверен
a) в порядке ли этот подход - он так же безопасен для jwt (кроме проверки издателей и т. Д.)?
b) как решить, имеет ли запрашиваемая конечная точка, например, атрибут [CustomAuthorize]
, который указывает, что вам нужно авторизоваться, чтобы войти в эту конечную точку?
Я должен использовать, например, отражение, чтобы получить путь для HomeController
TestMethod
?
Пример псевдокода:
Чтение токена из __MyToken
http заголовкаи затем проверьте, существует ли is в словаре
Если его нет, перенаправьте на /login/
, в противном случае добавьте UserInfo
к HttpContext.Items
Конечно,позже я хотел бы переместить _loggedUsers в какой-либо другой сервис, который будет добавлен сюда через конструктор AuthMiddleware, но сейчас я просто пытаюсь получить концепцию
public class AuthMiddleware : IMiddleware
{
private static readonly ConcurrentDictonary<Guid, UserLoginInfo> _loggedUsers = new ConcurrentDictonary<Guid, UserLoginInfo>();
public async Task InvokeAsync(HttpContext context, RequestDelegate next)
{
Guid? token = context.Request.Headers.First(x => x.Key == "__MyToken")?.Value;
if (EndpointWithAuthorizeAttribute(context.Request.Path) && TokenIsInvalid(token))
{
context.Response.Redirect("/login/");
}
else
{
// in order to access that data in controller, later.
context.Request.HttpContext.Items.Add("UserData", _loggedUsers[token]);
await next(context);
}
}
private bool TokenIsInvalid(Guid token)
{
return
token == null ||
token == Guid.Empty ||
!_loggedUsers.ContainsKey(token) ||
DateTime.Now > _loggedUsers[token].ExpirationTime);
}
}
public class UserLoginInfo
{
pubic Guid Id { get; set; }
pubic DateTime ExpirationTime { get; set; }
}