1

我想連接ASP MVC 4 WebAPI中的自定義會員資格,但我無法弄清楚如何替換當前的提供程序。我已經在提供程序的構造函數中放置了一個斷點,並且它從不登陸它。運行下面的測試會給我一個GetResponse調用中的「401 Unauthorized」消息,所以SOMETHING試圖驗證請求。我哪裏錯了?幾乎相同的代碼在ASP MVC 4站點(而不是WebAPI)中運行。無法獲得自定義ASP MVC 4 WebAPI MembershipProvider被稱爲

我知道測試中的一般邏輯正在工作,因爲如果我刪除授權屬性,測試成功。

這是我的WebConfig:

<authentication mode="Forms" /> 
<profile enabled="false"> 
    <providers> 
    <clear/> 
    </providers> 
</profile> 
<membership defaultProvider="MyMembershipProvider"> 
    <providers> 
    <clear/> 
    <add name="MyMembershipProvider" 
     type="CustomWebApiMembershipProvider" 
     applicationName="AppName"/> 
    </providers> 
</membership> 

<roleManager enabled="true" defaultProvider="MyWebApiRoleProvider"> 
    <providers> 
    <clear/> 
    <add name="MyWebApiRoleProvider" type="CustomWebApiRoleProvider" /> 
    </providers> 
</roleManager> 

這是我的供應商。

public class CustomWebApiMembershipProvider: MembershipProvider 
{ 
    public override bool ValidateUser(string username, string password) 
    { 
     return password.Contains("please"); 
    } 

    public CustomWebApiMembershipProvider() 
    { 
     var x = "hello"; 
    } 

} 

這是我的控制器:

[Authorize] 
public class TestApiSecureController : ApiController 
{ 
    // GET api/<controller> 
    public IEnumerable<string> Get() 
    { 
     return new string[] {"CustomWebApi Secured Access"}; 
    } 
} 

,這是我的測試:

[Test] 
    public void Authorize_WhenApiKeyProvided_ReturnsValidResponse() 
    { 
     var request = WebRequest.Create("http://localhost:4011/api/TestApiSecure") as HttpWebRequest; 
     AddAuthorizationInfo(request, "username", "pleaseLetMeIn"); 

     //we keep timing out when stepping through in debug, so set huge timeout 
     request.Timeout = 100000; 

     var response = request.GetResponse(); 
     var reader = new StreamReader(response.GetResponseStream()); 
     var result = reader.ReadToEnd(); 
     Assert.IsTrue(result.Contains("CustomWebApi")); 
    } 
    private void AddAuthorizationInfo(HttpWebRequest request, string username, string password) 
    { 
     var usernamePwString = username + ":" + password; 
     var authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(usernamePwString)); 
     request.Headers["Authorization"] = "Basic" + authInfo; 
    } 

回答