Написание кастомной аутентификации + как я могу проверить, к какой конечной точке идет запрос - PullRequest
1 голос
/ 11 июня 2019

Я бы хотел реализовать свой собственный уровень аутентификации, но я не уверен

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; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...