Используйте разные атрибуты авторизации для контроллеров для доступа к одной и той же логике из разных сред - PullRequest
0 голосов
/ 28 марта 2012

У меня есть веб-сайт ASP.NET MVC, на котором большинство моих контроллеров имеют атрибуты Authorize для принудительной аутентификации форм.

Я собираюсь сделать этот сайт доступным на Facebook через приложение Facebook, но для моих пользователей FB я хочу использовать другую аутентификацию / авторизацию, я хочу использовать атрибут CanvasAuthorize на моих контроллерах.

Проблема в том, что я не могу использовать оба на своих контроллерах / действиях, потому что тогда оба они будут принудительно доступны для доступа к соответствующему действию, но я хочу только Авторизоваться для обычного веб-сайта, и я хочу только CanvasAuthorize, когда доступ к сайту осуществляется из FB (через приложение FB).

Я начал

  1. рефакторинг огромного количества моих существующих контроллеров в 'controllerhelpers'
  2. заставить существующие контроллеры (с атрибутом authorize) использовать соответствующий метод controllerhelpers
  3. создать новые контроллеры (украшенные CanvasAuthorize) для FB-приложения, которые также используют соответствующие методы controllerhelper

Но это огромная работа, и я не уверен, стоит ли идти этим путем, или есть намного более элегантный способ работы.

Конечно, я хочу использовать те же представления, и в моих cshtmls я использую методы Url.Action определенных контроллеров, так что с моим текущим подходом я вставляю пути действия в мои cshtmls (например, для jQuery ajax) Свойства URL) Я должен сделать оператор if, чтобы использовать, например, «PersonalController», когда используется обычный веб-сайт, и использовать «FBPersonalController», когда веб-сайт используется в качестве приложения FB.

В этом случае PersonalController украшен [Authorize], а FBPersonalController украшен [CanvasAuthorize].

Итак, любая обратная связь приветствуется;)

Спасибо!

Ответы [ 2 ]

0 голосов
/ 29 марта 2012

Ответ Xoyoja привел меня к этому решению.Я не отмечаю его как «принятый ответ», потому что оцениваю его, но, возможно, стоит обсудить:

Нет, не все из них должны быть украшены.Но с вашим предложением я пришел к следующему:

IEnumerable<Func<ControllerContext, ActionDescriptor, object>> conditions =
                new Func<ControllerContext, ActionDescriptor, object>[] { 

                    (ctrlCtx, actDesc) =>
                        {
                            if(FacebookWebContext.Current.SignedRequest != null)
                            {
                                return new CanvasAuthorize();
                            }
                            else
                            {
                                if(ctrlCtx.Controller.GetType() == typeof(AccountController)
                                    && actDesc.ActionName == "LogOn")
                                {
                                    return null;
                                }
                                return new AuthorizeAttribute();
                            }
                        },
            };

Когда к моему веб-сайту обращаются из FB, кажется, что SignedRequest не является нулевым, поэтому CanvasAuthorize можно использовать.

Если доступ к моему веб-сайту осуществляется по обычному опубликованному URL-адресу, я использую AuthorizeAttribute.

Требуется логика, связанная с действием AccountController и "LogOn", чтобы разрешить вход на веб-сайт с публичного URL-адреса.В Facebook контекст содержит идентификатор пользователя Facebook, который косвенно будет выполнять аутентификацию.

Я все еще думаю о последствиях, наихудших сценариях, бэкдорах, может ли это причинить мне вред или нет.

0 голосов
/ 29 марта 2012

Можете ли вы использовать Условный фильтр для поддержки [Authorize] и [CanvasAuthorize]?Как я тестировал в простом приложении ASP.NET MVC3, оно работает.Как вы думаете, это помогает?

С другой стороны, хорошим решением было бы, если бы вы могли изменить свой дизайн, поместить элементы аутентификации в одном месте, то есть FormsAuthenticationService, FacebookAuthenciationService и OpenIDAuthencitationService реализовать интерфейсназывается "IAuthenticationService".Вызовите стандартный метод FomsAuthentication.SetAuthCookie после завершения потока OAuth Facebook.Атрибут Authorize должен работать правильно.См. этот вопрос и проверьте фрагменты кода из здесь (Create.aspx и SessionController.cs).Пожалуйста, оцените.

...