1

ASP MVC 4 WebAPIでカスタムメンバーシッププライベートを接続しようとしていますが、現在のプロバイダーを置き換える方法がわかりません。プロバイダーのコンストラクターにブレークポイントを設定しましたが、ブレークポイントに到達することはありません。以下のテストを実行すると、GetResponse呼び出しで「401Unauthorized」メッセージが表示されるため、SOMETHINGがリクエストを検証しようとしています。どこが間違っているのですか?このほぼ同じコードは、ASP MVC 4サイト(WebAPIではない)で実行されます。

Authorize属性を削除するとテストが成功するため、テストの一般的なロジックが機能していることがわかります。

これは私の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;
    }
4

1 に答える 1

0

フォーム認証には、HttpWebRequest では処理されない Cookie マジックが必要なようです。独自の Authorize 属性を作成する必要があります - チェックアウト: http://www.piotrwalat.net/basic-http-authentication-in-asp-net-web-api-using-membership-provider/

于 2012-07-21T02:12:11.500 に答える