0

Я строю mvc 4 веб-проект api на Azure. Запросы к этому API пройти маршрут:Служба контроля доступа через IHttpModule с mvc 4 и веб-api, различные настройки безопасности для сайта и службы?

 routes.MapHttpRoute(
      name: "DefaultApi", // Route name 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
    ); 

На том же домене и другим путем, у меня есть MVC веб-сайт создан:

 routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
    ); 

MVC веб-сайт просто HTML и Javascript страницу, которая взаимодействует с службами контроля доступа, чтобы получить токен, который затем переходит к сервису для получения данных через jQuery ajax.

Чтобы реализовать безопасность сервисов (проверить токен, отправленный API), я использую классы SWTModule и TokenValidator, как описано на этом article, а также вызов в моем проекте Web.Config веб-приложения MVC 4. атрибут веб-сервер:

<modules runAllManagedModulesForAllRequests="true"> 
    <add name="SWTModule" type="SecurityModule.SWTModule, SecurityModule" /> 
</modules> 

даже если я не пометили методы MVC контроллера с [Авторизоваться], загрузка страниц результатов веб-умолчанию в этой ошибки:

Server Error in '/' Application.

unauthorized

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.ApplicationException: unauthorized

Source Error:

Line 43: Line 44: // check that it starts with 'WRAP' Line 45: if (!headerValue.StartsWith("WRAP ")) Line 46:
{ Line 47: throw new ApplicationException("unauthorized");

Source File: D:\Dev\VisualStudio2010\Projects\myServices\Azure\myDataInterfaces\SecurityModule\SWTModule.cs Line: 45

Stack Trace:

[ApplicationException: unauthorized]
SecurityModule.SWTModule.context_BeginRequest(Object sender, EventArgs e) in D:\Dev\VisualStudio2010\Projects\myServices\Azure\myDataInterfaces\SecurityModule\SWTModule.cs:45 System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +80 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +270

Мне кажется, что, несмотря на то, Я не отмечу d мои методы контроллера с [Authorize], они отклоняются, потому что моя проверка токена SWT запускается для каждого ответа, по-видимому, потому, что она вызвана раньше в веб-стеке из-за включения в атрибут Web.Config?

Может ли кто-нибудь указать мне в правильном направлении, как это сделать? Я хочу сделать так, чтобы веб-страница по умолчанию (метод индекса Home controller) показывала мой экран входа в систему, который затем перенаправляется на главную страницу. Эта главная страница должна возвращаться неавторизованно, если пользователь не вошел в систему с одним из доступных поставщиков идентификации ACS. Аналогично, я хочу опубликовать некоторые из моих методов API ApiController для веб-API и потребовать авторизацию для других.

В настоящее время у меня есть приложение MVC и служба веб-API, маршрутизируемые через один файл Global.asax в рамках одного проекта веб-приложения в одном решении для веб-роли в Visual Studio. Мне интересно, можно ли исправить это, чтобы отделить сайт HTML MVC и веб-API к различным проектам веб-приложений под тем же решением для веб-роли? Это все равно не даст мне средств для назначения требований к авторизации для некоторых методов контроллера, просто дайте мне другое место для маршрутизации контроллеров и ApiControllers.

Я чувствую, что я близок, но, возможно, не хватает чего-то большого, но, похоже, я не нашел его в Интернете. Кто-то выпрямил меня?

Спасибо, Alex

ответ

0

Прежде всего, он смотрит на меня, что ваш механизм авторизации бросает исключение. Обычно вы возвращаете запрос со статусом 403 «Запрещено».

Правильный способ сделать это в веб-API - это создать DelegatingHandler, а не модуль.

Посмотрите на Dominick Baier's ThinkTecture.

Также бесстыдно plug.

+0

ОК ... это имеет смысл, мне казалось, что я использовал неправильную часть стека, чтобы делать то, что хотел, спасибо дать ThinkTecture статьи идти. – user483679

1

В вашем посте есть несколько вопросов, поэтому не уверен, что именно вы ожидаете. Я просто отвечу на ваш вопрос о том, почему модуль не работает, поскольку это, по-видимому, является основным.

Да, SWTModule будет перехватывать все вызовы, объясняя, почему это не удается при доступе к маршруту MVC. Модуль ничего не знает об атрибуте Authorize. Если вы хотите, чтобы это сработало, вам лучше пойти с советами Aliostad и использовать DelegatingHandler. Если вы хотите «просто» заставить его работать на данный момент, вы можете проверить путь выполнения запроса в модуле, чтобы он проверял только пути вашего api (обратите внимание, что это не будет работать для общедоступных методов api, поскольку модуль не Знание атрибутов)

Да, использование двух отдельных проектов также будет работать, поскольку модуль будет применяться только к проекту, в который он добавлен.

Опять же, это быстрый и грязный путь, чтобы заставить его работать, что может быть хорошо, если это POC использования ACS. В противном случае вам придется сделать еще несколько домашних заданий. Доминик написал несколько действительно good articles на эту тему. Ознакомьтесь с статьями «ASP.NET WebAPI Security № 1 до № 4»

+0

Спасибо, я бы дал вам ответ, если бы вы были первыми, но я проголосую за вас, потому что вы расшифровали некоторые из моих неправильных соображений для меня и очень хорошо контекстуализировали ... спасибо, я думаю, что смогу получить это сейчас. – user483679

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

  • Нет связанных вопросов^_^