Значение частного поля перезаписывается в пользовательском атрибуте AuthorizationFilterAttribute.

Проект Web API 2 и C# 7.

У меня есть собственный атрибут авторизации AuthorizeAccessAttribute что я использую на своих контроллерах и конечных точках для выполнения пользовательской авторизации.

Моя проблема в том, что мой атрибут имеет личное нестатическое поле, accountIdЯ использую, чтобы назначить идентификатор. Но когда несколько запросов обрабатываются одновременно, это значение изменяется, как если бы оно было статической общей переменной. Все запросы правильно устанавливают значение параметра, но значение изменяется для всех других запросов, если оно установлено. Таким образом, они борются друг с другом, чтобы установить правильное значение.

У меня сложилось впечатление, что каждый запрос инициализирует совершенно новый контекст, контроллер, атрибуты и т. Д. И т. Д. - работает, поэтому я не совсем понимаю, что происходит. Это предполагаемое поведение, или я делаю что-то не так или упускаю что-то очевидное? Я надеюсь, что есть некоторые эксперты, которые могут помочь мне здесь!!!

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public class AuthorizeAccessAttribute : AuthorizationFilterAttribute, IAuthorizationFilter
{
    // The value of this field equals the value that was set by the latest request, when multiple requests are processed simultaneously.
    private string accountId;

    public override async Task OnAuthorizationAsync(HttpActionContext actionContext, CancellationToken cancellationToken)
    {
        // Get the value of the parameter.
        TryGetRouteParameterValue(actionContext, "parameterName", out this.accountId);

        // Make sure user is authorized.
        if (!IsAuthorized(actionContext, cancellationToken))
            HandleUnauthorizedRequest(actionContext);
    }

    private void TryGetRouteParameterValue<T>(HttpActionContext actionContext, string parameterName, out T parameterValue)
    {
        // Extract value from ActionContext arguments.
        parameterValue = (T)(actionContext?.Request?.GetRouteData()?.Values[parameterName]);
    }

    protected bool IsAuthorized(HttpActionContext actionContext, CancellationToken cancellationToken)
    {
        // When using this.accountId to perform authorization here, the value equals the value that was set by the latest request, when multiple requests are processed simultaneously.
        var sharedValue = this.accountId;

        // Auth logic here..
    }

    protected void HandleUnauthorizedRequest(HttpActionContext actionContext) { /* Handle unauthorized. */ }
}

[AuthorizeAccess]
public class SomeController : BaseApiController
{
    [AuthorizeAccess]
    public async Task<IHttpActionResult> SomeEndpoint(string parameterName)
    { .. }
}

0 ответов

Другие вопросы по тегам