【问题标题】:IsAuthorized of the AuthorizeAttribute is always false in the unit test单元测试中 AuthorizeAttribute 的 IsAuthorized 始终为 false
【发布时间】:2015-05-22 09:30:51
【问题描述】:

我正在尝试测试我的自定义AuthorizeAttribute,但无论IsAuthenticated 如何,基类的IsAuthorized 方法总是返回false。让我给你看一些代码(为简洁起见,省略了一些部分):

授权属性

public class UserAuthorizeAttribute : System.Web.Http.AuthorizeAttribute
{
    protected override bool IsAuthorized(HttpActionContext actionContext)
    {
        if (!base.IsAuthorized(actionContext)) // always returns false
            return false;

        //... not important user permission check

        return true;
    }
}

GetPrincipal 方法模拟 IPrincipal

public static IPrincipal GetPrincipal()
{
    var user = new Mock<IPrincipal>();
    var identity = new Mock<IIdentity>();
    identity.Setup(x => x.Name).Returns("Superman");
    identity.Setup(p => p.IsAuthenticated).Returns(true);
    user.Setup(x => x.Identity).Returns(identity.Object);
    Thread.CurrentPrincipal = user.Object;

    return user.Object;
}

测试方法

[TestMethod]
public void Test()
{
    HttpActionContext actionContext = ContextUtil.CreateActionContext();

    var attribute = new UserAuthorizeAttribute();
    IPrincipal user = Thread.CurrentPrincipal;

    // yep, this passes
    Assert.IsTrue(user.Identity.IsAuthenticated, "Superman is not authenticated");

    attribute.OnAuthorization(actionContext);
}

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

【问题讨论】:

    标签: c# unit-testing asp.net-web-api


    【解决方案1】:

    主体不是取自当前线程,而是取自actionContext。所以,你必须设置的是动作上下文的请求上下文中的主体:

    actionContext.RequestContext.Principal = yourPrincipal;
    

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

    【讨论】:

    • 太棒了,谢谢。但是我不得不将其更改为actionContext.RequestContext.Principal。问题:我有旧版本源代码的链接吗?
    • 不!我直接从您的链接中阅读了它。查找此代码:IPrincipal user = actionContext.ControllerContext.RequestContext.Principal;
    • @Zabavsky,面临类似问题。我不是在单元测试中编写代码。 Principal 从 Azure AD 返回,在执行 base.IsAuthorized(actionContext) 时,始终返回 false
    猜你喜欢
    • 2022-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多