6

Я по всему интернету пытался выяснить, почему мой пользовательский авторизованный атрибут не работает в моем MVC WebApi. Я видел, как люди спрашивают о такого рода вещи на SO, но ничего не помогло мне решить мою проблему еще:Пользовательский авторизованный атрибут, не вызываемый MVC Framework

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, 
       Inherited = false)] 
    public sealed class CustomAuthorization : AuthorizeAttribute 
    { 

     //... 

     protected override bool AuthorizeCore(HttpContextBase httpContext) 
     { 
      // custom auth logic, returns true if authorized, false otherwise 
     } 
    } 

Я простирающийся от System.Web.Mvc в отличие от System.Web.Http. Однако мой AuthorizeCore(HttpContextBase httpContext) никогда не вызывается.

У меня есть конструктор в моем CustomAuthorization класс, который принимает params string[], которые являются имена моих пользовательских разрешений, необходимых для конкретного действия, например:

[CustomAuthorization("Some Permission")] 
[System.Web.Http.HttpGet] 
public CustomResponse SomeAction() 
{ 
    //... 
} 

То, что я надеюсь достичь должен иметь свое разрешение код запускается всякий раз, когда делается запрос на действие, украшенное атрибутом [CustomAuthorization]. Я также хочу иметь возможность вернуть более описательное сообщение об ошибке, если авторизация завершается с ошибкой. Не просто:

{"Message":"Authorization has been denied for this request."} 

Я считаю, что это связанно с наиважнейшей HandleUnauthorizedRequest, но как я могу это сделать, чтобы обеспечить свой собственный объект, что ответ JSON будет сериализовать?

Подводя итог, мой код авторизации никогда не вызывается каркасом, даже если я украшаю действия своим атрибутом [CustomAuthorization]. Он просто переходит к выполнению кода внутри действия.

Во-вторых, как я могу реализовать несанкционированные ответы для сериализации пользовательского объекта JSON?

Спасибо за вашу помощь заранее, это очень ценится!

+0

Основываясь на моих комментариях о том, как я применил специальный атрибут авторизации ... Для начала я думаю, что вы хотите переопределить OnAuthorization, а не AuthorizeCore. Кроме того, я не уверен, что вам нужно, чтобы ваш класс был запечатан. –

ответ

6

Хорошо я в конце концов решил это, и вот как:

public override void OnAuthorization(HttpActionContext actionContext) { 

    .... 

    if (!authorized) { 

     actionContext.Response =  
        actionContext.Request.CreateResponse(
            HttpStatusCode.Unauthorized, 
            new Dictionary<string, string> { 
               { "hello", "world" } 
            } 
       ); 

    } 

}

Который производит результат:

{"hello":"world"} 

Словарь объект является произвольным, он просто показывает, что тип будет успешно сериализован для ответа.

Если вы не установили actionContext.Response, запрос будет продолжен целевым действием - то есть. это разрешено этим фильтром.

Надежды, которые помогают другим в этом положении.

+0

молодцы ...... –

+0

Это было облегчение, чтобы найти решение так просто! Спасибо за ваши усилия, очень ценится. Рад, что все работает сейчас! – ComethTheNerd

Смежные вопросы