у нас есть веб-API mvc, где мы реализовали защиту на основе токенов для потребителей API, и токен генерируется с использованием Microsoft.Owin.Security.AuthenticationTicket, а затем у нас есть собственный атрибут, унаследованный от AuthorizeAttribute.Токен всегда проверяется с помощью base.IsAuthorized (actionContext), когда мы вызываем его внутри метода OnAuthorization, но эта проверка выполняется только в наших локальных средах и средах разработки.Обратите внимание, что мы поставляем токен в заголовке авторизации запроса с однонаправленным каналом. В тестовой среде авторизация завершается неудачно при двух последовательных вызовах всегда со вновь сгенерированным токеном, но успешно выполняется в третий раз, и этот шаблон продолжается следующим образом.
Настраиваемый атрибут проверки токена.
public class UserAuthenticationFilter : AuthorizeAttribute
{
public override void OnAuthorization(HttpActionContext actionContext)
{
if (!base.IsAuthorized(actionContext))
actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized);
else
{
// Token valid. Do some work
}
}
}
Код генерации токена
public string GenerateToken(string consumerId)
{
var tokenExpiration = TimeSpan.FromMinutes(60);
var identity = new ClaimsIdentity(OAuthDefaults.AuthenticationType);
identity.AddClaim(new Claim("ConsumerId", consumerId));
var props = new AuthenticationProperties()
{
IssuedUtc = DateTime.UtcNow,
ExpiresUtc = DateTime.UtcNow.Add(tokenExpiration),
};
var ticket = new AuthenticationTicket(identity, props);
return Startup.OAuthOptions.AccessTokenFormat.Protect(ticket);
}
Эта вещь отлично работает как в локальной среде, так и в среде разработки.Но когда мы развернули в тестовой среде, он дает 401-несанкционированному два раза, а в третий раз он работает нормально.