C# 在单元测试中,authorized属性的IsAuthorized始终为false

C# 在单元测试中,authorized属性的IsAuthorized始终为false,c#,unit-testing,asp.net-web-api,C#,Unit Testing,Asp.net Web Api,我试图测试我的自定义authorized属性,但是基类的IsAuthorized方法总是返回false,而不管IsAuthorized。让我向您展示一些代码(为了简洁起见,省略了一些部分): 授权属性 public类UserAuthorizeAttribute:System.Web.Http.AuthorizeAttribute { 受保护的覆盖布尔已授权(HttpActionContext actionContext) { 如果(!base.IsAuthorized(actionContext

我试图测试我的自定义
authorized属性
,但是基类的
IsAuthorized
方法总是返回false,而不管
IsAuthorized
。让我向您展示一些代码(为了简洁起见,省略了一些部分):

授权属性

public类UserAuthorizeAttribute:System.Web.Http.AuthorizeAttribute
{
受保护的覆盖布尔已授权(HttpActionContext actionContext)
{
如果(!base.IsAuthorized(actionContext))//始终返回false
返回false;
//…不重要的用户权限检查
返回true;
}
}
GetPrincipal方法模拟
IPrincipal

publicstaticiprincipal GetPrincipal()
{
var user=new Mock();
var identity=newmock();
identity.Setup(x=>x.Name).Returns(“超人”);
Setup(p=>p.IsAuthenticated)。返回(true);
user.Setup(x=>x.Identity).Returns(Identity.Object);
Thread.CurrentPrincipal=user.Object;
返回user.Object;
}
测试方法

[TestMethod]
公开无效测试()
{
HttpActionContext actionContext=ContextTil.CreateActionContext();
var attribute=new UserAuthorizeAttribute();
IPrincipal用户=Thread.CurrentPrincipal;
//是的,这过去了
Assert.IsTrue(user.Identity.IsAuthenticated,“超人未经验证”);
属性。OnAuthorization(actionContext);
}

根据属性的属性,它应该只检查
Thread.CurrentPrincipal.Identity.IsAuthenticated
,因为我没有专门分配任何用户或角色。有什么线索我在这里遗漏了什么吗?

主体不是来自当前线程,而是来自
actionContext
。因此,您必须在操作上下文的请求上下文中设置主体:

actionContext.RequestContext.Principal = yourPrincipal;

在创建操作上下文之后,在调用测试方法之前,请立即执行此操作。

太棒了,谢谢。然而,我不得不将其更改为
actionContext.RequestContext.Principal
。问:我有旧版本源代码的链接吗?没有!我直接从你的链接上读到的。查找此代码:
IPrincipal user=actionContext.ControllerContext.RequestContext.Principal@Zabavsky,面临类似问题。我不是在单元测试中编写代码。主体从Azure AD返回,当执行
base.IsAuthorized(actionContext)
时,它总是返回
false