Вызвать действие, которое использует ASP.NET MVC [Authorize] извне приложения - PullRequest
1 голос
/ 30 марта 2010

Возможно ли это?

Я хочу предоставить URL (действие), например http://mysever/myapp/UpdateHeartbeat/.

В моем приложении MVC это выглядит как

[Authorize]
[AcceptsVerbs(HttpVerbs.Post)]
public ActionResult UpdateHeartbeat()
{
    // update date in DB to DateTime.Now
}

Теперь в моем приложении MVC пользователь вошел в систему с помощью аутентификации FORMS, и он может выполнить это действие для своего сердца.

То, что я хочу сделать, это нажать этот URL из консольного приложения и иметь возможность аутентификации (как часть API, который я хотел бы создать) - есть ли способ сделать это без удаления [Авторизовать ] и добавление имени пользователя / пароля в качестве параметров в POST?

Ответы [ 2 ]

2 голосов
/ 30 марта 2010

Конечно, это возможно. Это делается в модульном тестировании все время. Лично я использую RhinoMocks вместе с MVCContrib.TestHelper для вызова действий моего контроллера, как аутентифицированных, так и не аутентифицированных. Вот пример кода, который я использую для тестирования своих контроллеров:

    private MockRepository _mocks = new MockRepository(); 

    public ControllerTestBase()
    {
    }

    public static T GetController<T>()
    {
        return this.GetController<T>(null);
    }

    public T GetController<T>(BPUser authenticatedUser)
    {            
        TestControllerBuilder testContBuilder = new TestControllerBuilder();

        if (authenticatedUser != null)
        {               
            var identity = _mocks.DynamicMock<IIdentity>();                

            SetupResult.For(identity.IsAuthenticated).Return(true);
            SetupResult.For(identity.Name).Return(authenticatedUser.ID.ToString());
            _mocks.Replay(identity);

            var pAttrs = new System.Collections.Hashtable();
            pAttrs["UserID"] = authenticatedUser.ID.ToString();
            pAttrs["UserName"] = authenticatedUser.UserName;
            testContBuilder.HttpContext.User = new UserPrinciple(identity, new string[] { }, pAttrs);
        }

        return testContBuilder.CreateController<T>();
    }

Там есть немного пользовательских вещей для моей реализации IPrinciple, но, надеюсь, это начало.

Редактировать - Пример использования Вот как бы вы использовали это:

var authenticatedUser = SomeCodeToGetMyUser();
var controller = ControllerTestBase.GetController<YourController>(authenticatedUser);
controller.UpdateHeartbeat();
0 голосов
/ 30 марта 2010

Фильтр Authorize фактически получает IPrincipal для пользователя из текущего контекста, поэтому это будет невозможно. Вам понадобится альтернативная форма аутентификации для этого метода.

Быстрый поиск в Google предоставляет ссылку на следующее сообщение в блоге, которое может быть полезно:

http://davidhayden.com/blog/dave/archive/2009/04/09/CustomAuthorizationASPNETMVCFrameworkAuthorizeAttribute.aspx

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