相关疑难解决方法(0)

单元测试ASP.Net MVC Authorize属性以验证重定向到登录页面

这可能只是需要另一双眼睛的情况.我必须遗漏一些东西,但我无法弄清楚为什么这种东西无法测试.我基本上试图通过使用[Authorize]属性标记控制器来确保未经身份验证的用户无法访问视图,并且我尝试使用以下代码对此进行测试:

[Fact]
public void ShouldRedirectToLoginForUnauthenticatedUsers()
{
    var mockControllerContext = new Mock<ControllerContext>()
                         { DefaultValue = DefaultValue.Mock };
    var controller = new MyAdminController() 
              {ControllerContext = mockControllerContext.Object};
    mockControllerContext.Setup(c =>
               c.HttpContext.Request.IsAuthenticated).Returns(false);
    var result = controller.Index();
    Assert.IsAssignableFrom<RedirectResult>(result);
}
Run Code Online (Sandbox Code Playgroud)

我正在寻找的RedirectResult是某种指示用户被重定向到登录表单,但总是返回一个ViewResult,并且在调试时我可以看到即使用户是,也成功命中了Index()方法未经过身份验证.

难道我做错了什么?测试在错误的水平?我是否应该在路线级别测试此类事情?

我知道[Authorize]属性正在运行,因为当我启动页面时,登录屏幕确实被强加给了我 - 但我如何在测试中验证这一点?

控制器和索引方法非常简单,以便我可以验证行为.我把它们包括在内是为了完整性:

[Authorize]
public class MyAdminController : Controller
{
    public ActionResult Index()
    {
        return View();
    }
}
Run Code Online (Sandbox Code Playgroud)

任何帮助赞赏...

asp.net-mvc

63
推荐指数
2
解决办法
3万
查看次数

通过 TestServer 测试用 [Authorize] 属性修饰的控制器

我的应用程序是一个 ASP.NET Core 1.0 Web API。

我想用TestServer对象测试我的控制器。

我有一个用Authorize属性装饰的控制器类。

我如何获得我的测试客户端:

protected HttpClient GetTestClient(){
         var builder =
            new WebHostBuilder().UseContentRoot(this.path)
               .UseStartup<Startup>()
               .UseEnvironment("Development")
               .ConfigureServices(services => services.AddTransient<IAnInterface, AMock>());

         var server = new TestServer(builder);
         var client = server.CreateClient();

         return client;
      }
Run Code Online (Sandbox Code Playgroud)

我如何使用它的片段:

[TestMethod]
public void ShouldReturnSuccessful()
{
     var response = await this.client.PostAsync(Url, content);
     response.EnsureSuccessStatusCode();
}
Run Code Online (Sandbox Code Playgroud)

如果我Authorize从控制器类中删除该属性,我的所有测试都可以正常工作,但是如果Authorize设置了该属性,我就会明白System.Net.Http.HttpRequestException: Response status code does not indicate success: 401 (Unauthorized). 这是有道理的。

现在我知道我可以Bearer Token从请求TestServer并执行以下操作:

client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "My …
Run Code Online (Sandbox Code Playgroud)

.net-security authorize-attribute oauth-2.0 asp.net-web-api asp.net-core

6
推荐指数
0
解决办法
1237
查看次数