【问题标题】:ASP.NET Web Api: authenticating using in memory hosting for Integration testsASP.NET Web Api:使用内存托管进行身份验证以进行集成测试
【发布时间】:2013-03-18 05:22:37
【问题描述】:

我正在尝试使用内存托管来集成测试我们的 Web api 项目,但在使用它时遇到了身份验证问题。我使用默认的 Web Api 模板和它创建的值控制器在一个基本的 Web Api 项目上重新创建了它。

我们正在使用 Autofac,因此也将其包含在测试中。我们也在为 web api 使用 windows 身份验证,但对于测试而言,这并不重要。

问题是测试中的“服务器”总是返回“此请求的授权已被拒绝。”

那么使用内存服务器进行授权的最佳方式是什么?我已经从另一个 stackoverflow 问题中注释掉了一些代码,但这似乎也不起作用。

using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Web.Http;
using Autofac;
using Autofac.Integration.WebApi;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using WebApiTesting.Controllers;

namespace WebApiTesting.Tests.Controllers
{
    [TestClass]
    public class ValuesControllerTest
    {
        private const string URL = "http://test.testing.com/";
        private const string Username = "user";
        private const string Password = "supersecret";

        [TestMethod]
        public void InMemoryHosting()
        {
            var config = new HttpConfiguration();
            config.Routes.MapHttpRoute(name: "DefaultApi",
                                       routeTemplate: "api/{controller}/{id}",
                                       defaults: new {id = RouteParameter.Optional});
            config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;

            var server = new HttpServer(config);
            var builder = new ContainerBuilder();
            // Register API controllers using assembly scanning.
            builder.RegisterApiControllers(typeof(ValuesController).Assembly);
            var container = builder.Build();
            server.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container);

            var client = new HttpClient(server);
            using (var request = CreateRequest("api/values", "application/json", HttpMethod.Get))
            {
                //Act
                using (HttpResponseMessage response = client.SendAsync(request).Result)
                {
                    // Assert
                    Assert.IsNotNull(response.Content);
                    Assert.AreEqual("application/json", response.Content.Headers.ContentType.MediaType);
                    var content = response.Content.ReadAsStringAsync().Result;
                    Assert.AreNotEqual("{\"Message\":\"Authorization has been denied for this request.\"}", content);
                }
            }
        }

        private HttpRequestMessage CreateRequest(string url, string mthv, HttpMethod method)
        {
            var request = new HttpRequestMessage { RequestUri = new Uri(URL + url) };
            /*byte[] toEncodeAsBytes = Encoding.UTF8.GetBytes(string.Format("{0}:{1}", Username, Password));
            request.Headers.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(toEncodeAsBytes));*/
            request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue(mthv));
            request.Method = method;
            return request;
        }
    }
}

【问题讨论】:

    标签: asp.net-mvc asp.net-web-api asp.net-authentication


    【解决方案1】:

    为了记录最终的效果,我在我的 CreateRequest 方法中添加了以下行

    Thread.CurrentPrincipal = new ClientRolePrincipal(new HttpListenerBasicIdentity(Username, Password));
    

    我不确定这是否是处理它的最佳方法,但至少它确实有效。

    【讨论】:

    • 我不确定这是否是最好的处理方式,但这是微软推荐的方式。
    • @msfanboy - 一个指向此 Microsoft 建议的链接将不胜感激
    猜你喜欢
    • 1970-01-01
    • 2013-11-22
    • 1970-01-01
    • 2018-03-19
    • 2015-01-12
    • 2013-11-16
    • 2017-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多