【问题标题】:Unit Test Web API - How to get auth token单元测试 Web API - 如何获取身份验证令牌
【发布时间】:2016-06-20 09:48:04
【问题描述】:

我为我的 WebApi 应用程序使用令牌身份验证。

我在 Startup 类中有以下 ConfigureAuth 方法:

        // Configure the application for OAuth based flow
        PublicClientId = "self";
        OAuthOptions = new OAuthAuthorizationServerOptions
        {
            TokenEndpointPath = new PathString("/Token"),
            Provider = new ApplicationOAuthProvider(PublicClientId),
            AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
            AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
            // In production mode set AllowInsecureHttp = false
            AllowInsecureHttp = true
        };

        // Enable the application to use bearer tokens to authenticate users
        app.UseOAuthBearerTokens(OAuthOptions);

和 ApplicationOAuthProvider:

public class ApplicationOAuthProvider : OAuthAuthorizationServerProvider
{
    private readonly string _publicClientId;

    public ApplicationOAuthProvider(string publicClientId)
    {
        if (publicClientId == null)
        {
            throw new ArgumentNullException("publicClientId");
        }

        _publicClientId = publicClientId;
    }

    public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
    {
        var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>();

        var user = await userManager.FindAsync(context.UserName, context.Password);
        //ApplicationUser user = new ApplicationUser() { UserName ="a" };

        if (user == null)
        {
            context.SetError("invalid_grant", "The user name or password is incorrect.");
            return;
        }

        ClaimsIdentity oAuthIdentity = await user.GenerateUserIdentityAsync(userManager,
           OAuthDefaults.AuthenticationType);
        ClaimsIdentity cookiesIdentity = await user.GenerateUserIdentityAsync(userManager,
            CookieAuthenticationDefaults.AuthenticationType);

        AuthenticationProperties properties = CreateProperties(user.UserName);
        AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, properties);
        context.Validated(ticket);
        context.Request.Context.Authentication.SignIn(cookiesIdentity);
    }

所以,我应该调用 /Token 并传递凭据以获取令牌。它有效,但我想为它创建单元测试。有可能吗?

【问题讨论】:

    标签: unit-testing authentication asp.net-web-api oauth asp.net-web-api2


    【解决方案1】:

    我喜欢可插拔配置的想法。 对于单元测试项目,我想使用特定的身份并从 LDAP 获取可预测的数据。因此,在设置 http 配置时,我在单元测试方法中使用了以下行:

    config.Filters.Add(new WebApiSetIdentityFilter(config, identityName));
    

    过滤器只是“破解”身份,替换我需要的字段:

    public async Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken)
    {
        //This principal flows throughout the request.
        context.Principal = new GenericPrincipal(new GenericIdentity(this.IdentityName, "LdapAuthentication"), new string[0]);
    }
    

    【讨论】:

      【解决方案2】:

      做到这一点的唯一方法是进行集成测试,该测试断言完整的管道测试 - 从请求到响应。在服务器上实际测试之前,您可以调用令牌端点来获取它,然后通过将其附加到响应中来在实际单元测试中使用它。我有一个示例,这里使用 MyTested.WebApi:

      Sample

      您可以在没有测试库的情况下做同样的事情,这就是如何做到这一点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-02-13
        • 1970-01-01
        • 2017-04-19
        • 1970-01-01
        • 1970-01-01
        • 2019-03-05
        • 1970-01-01
        相关资源
        最近更新 更多