Я реализовал 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 бизнес-приложений, как мы можем гарантировать, что это аутентифицированный вызов и разрешить доступ к ресурсам?