Отдельный сервер для аутентификации / авторизации JWT - PullRequest
0 голосов
/ 04 марта 2019

Я реализовал JWT аутентификацию / авторизацию на основе токенов с использованием JWT Nuget , и она работает, как и ожидалось.Был в состоянии создать токен и использовать атрибут фильтра, как указано ниже, для проверки токена

public class JWTAuthentication : System.Web.Http.Filters.ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        try
        {
            if (actionContext.ActionDescriptor.GetCustomAttributes<IgnoreJWTAuthenticationAttribute>().Any())
                return;

            IEnumerable<string> authHeaderValues;
            actionContext.Request.Headers.TryGetValues("Authorization", out authHeaderValues);

            if (authHeaderValues == null)
            {
                actionContext.Response = UnAuthorisedResponse(actionContext, "Authorization header cannot be empty");
                return;
            }

            var bearerToken = authHeaderValues.ElementAt(0);
            var token = bearerToken.StartsWith("Bearer ") ? bearerToken.Substring(7) : bearerToken;

            Thread.CurrentPrincipal = JWTAuthToken.JWTAuth().ValidateToken(token, true);
            if (HttpContext.Current != null)
            {
                HttpContext.Current.User = Thread.CurrentPrincipal;
            }
        }
        catch (Exception ex)
        {
            actionContext.Response = UnAuthorisedResponse(actionContext, ex.Message);
        }
    }
    public System.Net.Http.HttpResponseMessage UnAuthorisedResponse(HttpActionContext actionContext, string message)
    {
        return actionContext.Request.CreateResponse(System.Net.HttpStatusCode.Unauthorized, message);
    }
}

public class JWTAuthorization : System.Web.Http.Filters.ActionFilterAttribute
{
    private string roles;

    public JWTAuthorization(string roles)
    {
        this.roles = roles;
    }

    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        var tempRoles = roles.Split(',').ToList();
        var userIdentity = (ClaimsIdentity)HttpContext.Current.User.Identity;
        var userRoles = Roles(userIdentity);
        if (!tempRoles.Intersect(userRoles).Any())
        {
            actionContext.Response = UnAuthorisedResponse(actionContext, "UnAuthorized Access");
        }
    }

    public System.Net.Http.HttpResponseMessage UnAuthorisedResponse(HttpActionContext actionContext, string message)
    {
        return actionContext.Request.CreateResponse(System.Net.HttpStatusCode.Unauthorized, message);
    }


    private List<string> Roles(ClaimsIdentity identity)
    {
        return identity.Claims
                       .Where(c => c.Type == ClaimTypes.Role)
                       .Select(c => c.Value)
                       .ToList();
    }
}

Мы предоставляем API для нескольких приложений, имеющих общую пользовательскую базу данных.Поэтому мы хотели бы отделить API аутентификации (например, создание токена, проверка токена) от API бизнес-приложений.Но мы не уверены, как это сделать?

Может быть, мы можем создать токен на сервере и проверить токен на сервере, где размещены бизнес-API, с использованием того же секретного ключа.Но и здесь логика проверки должна быть реализована во всех API бизнес-приложений.

Пожалуйста, помогите нам разобраться, как отделить Аутентификацию / Авторизацию от бизнес-API.В API бизнес-приложений, как мы можем гарантировать, что это аутентифицированный вызов и разрешить доступ к ресурсам?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...