Могу ли я проверить токены подписи HTTP-запроса и одноразовые номера с помощью привязки модели?

Я настраиваю конечную точку с помощью ASP.NET MVC, к которой могут выполняться запросы для управления и извлечения данных (в основном, API). Я использую двухстороннюю модель OAuth для проверки того, что запросы подписываются с использованием секретного ключа и метода подписи, а также таблицы nonce для предотвращения взлома.

Поскольку привязка модели очень удобна в ASP.NET MVC, я собираюсь воспользоваться ею для обработки запросов, но мне интересно, могу ли я запечь проверку подписи и обработку одноразовых / временных меток прямо в привязке модели. Это возможно? Таким образом, я могу просто повторно использовать реализацию в различных действиях, которые я создаю.


person Ryan    schedule 20.06.2011    source источник


Ответы (1)


Думаю, у тебя должно получиться. Попробуй это:

public class FooModelBinder : IModelBinder
    {
        public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            FooModel fooModel = bindingContext.Model as fooModel;
            if (fooModel != null)
            {
               // Do your verification stuff in here
               // Updating any properties of your Model.
               // Or you could retrieve something else entirely and return it if you like
               // Let's pretend we just want to verify the model and set some property or other.
               fooModel.NonceOkay = DoVerification(fooModel);
               fooModel.NextAction = WorkOutWhereToGoNext(fooModel);
               // or whatever
            }
            return fooModel;
        }
    }

DoVerification может жить в вашем ModelBinder, но может быть лучше, чтобы он жил в другом месте.

Затем вставьте это в Application_Start в свой Global.asax:

ModelBinders.Binders.Add(typeof(Foo), new FooModelBinder());
person Tom Chantler    schedule 20.06.2011
comment
Спасибо. Затем он будет по умолчанию использовать эту привязку модели всякий раз, когда у меня есть Foo в качестве параметра действия, верно? - person Ryan; 21.06.2011
comment
быстрый вопрос в той точке кода (внутри if), которую вы мне показали, как мне получить доступ к значениям HTTP-запроса, таким как значения и тело заголовка, тип содержимого и т. д. и т. д.? - person Ryan; 21.06.2011
comment
HttpContext доступен в controllerContext. например вы можете делать такие вещи: controllerContext.HttpContext.User.Identity.Name; и controllerContext.HttpContext.Request.Form["controlName"].ToString(); и так далее. Это круто! - person Tom Chantler; 21.06.2011
comment
круто, одна проблема ... похоже, он вообще не работает, я сделал все, как вы сказали, но ссылка на объект параметра, входящая в действие, ВСЕГДА НУЛЕВА: / - person Ryan; 21.06.2011