0

我使用令牌身份驗證爲我的WebApi應用程序。單元測試Web API - 如何獲得身份驗證令牌

我在啓動類以下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); 
    } 

所以,我應該叫/令牌和憑據傳遞拿到令牌。它有效,但我想爲它創建單元測試。可能嗎?

回答

3

要做到這一點的唯一方法是進行集成測試,該測試會斷言整個管道測試 - 從請求到響應。在服務器上進行實際測試之前,您可以調用令牌端點來獲取它,然後將其附加到響應中,然後在實際單元測試中使用它。我有一個樣品,在這裏使用MyTested.WebApi:

Sample

你可以做同樣的沒有測試庫,這僅僅是如何做到這一點。

+0

樣品溶液這樣做,我設置HTTP配置時使用下面的行中我的單元測試方法不行.. –

0

我喜歡插拔配置的想法。 對於單元測試項目,我想使用特定的身份並獲得可預測的LDAP數據。

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]); 
}