我意识到这个问题是关于在 webapi 端点从 RestSharp 发出“真实”请求,所以这个建议并不立即适用于 OPs 场景。但是:
我正在使用HttpConfiguration
,HttpServer
和使用内存中的 Web Api 测试HttpMessageInvoker
(很像我相信的巴德里的建议)。通过这种方式,我不需要打开侦听器或端口,因为我可以在内存中测试完整的堆栈(端到端测试)——在构建服务器、Heroku 实例等上非常方便。
使用内存测试,您可以通过以下方式设置Thread.CurrentPrincipal
.. 我的测试基类有一个助手,如下所示:
protected void AuthentateRequest()
{
Thread.CurrentPrincipal = new AuthenticatedPrincipal(Thread.CurrentPrincipal);
}
哪个使用这个:
public class AuthenticatedPrincipal : IPrincipal
{
private readonly IPrincipal _principalToWrap;
private readonly IIdentity _identityToWrap;
public AuthenticatedPrincipal(IPrincipal principalToWrap)
{
_principalToWrap = principalToWrap;
_identityToWrap = new AuthenticatedIdentity(principalToWrap.Identity);
}
public bool IsInRole(string role)
{ return _principalToWrap.IsInRole(role); }
public IIdentity Identity
{
get { return _identityToWrap; }
private set { throw new NotSupportedException(); }
}
}
public class AuthenticatedIdentity : IIdentity
{
private readonly IIdentity _identityToWrap;
public AuthenticatedIdentity(IIdentity identityToWrap)
{
_identityToWrap = identityToWrap;
}
public string Name
{
get { return _identityToWrap.Name; }
private set { throw new NotSupportedException(); }
}
public string AuthenticationType
{
get { return _identityToWrap.AuthenticationType; }
private set { throw new NotSupportedException(); }
}
public bool IsAuthenticated
{
get { return true; }
private set { throw new NotSupportedException(); }
}
}
手动存根似乎有点过头了,IPrincipal
但我尝试使用我的模拟框架,但它在我的一些测试运行程序(Resharper 和 TeamCity,但不是 NCrunch - 我认为关于在 AppDomains 上序列化的一些东西)中爆炸了。
这将设置Thread.CurrentPrincipal
在ApiController
action 方法中,因此欺骗AuthorizeAttribute
您相信您已通过身份验证。