5

ASP.NET SimpleMembershipを使用して、WebAPIを使用するユーザーを認証したいと思います。Thinktectureには、Thinktecture.IdentityModel(http://thinktecture.github.com/Thinktecture.IdentityModel.45/)と呼ばれるすばらしい認証ライブラリがあり、FormsAuthとBasicAuth(ソース)を結び付ける例があります。ただし、この例では、ASP.NETメンバーシッププロバイダーがないと機能しないMembership.ValidateUser()を使用しています。これは、SimpleMembership(ソース)ではサポートされていません(編集:これは完全には当てはまりません。以下のMarkの回答を参照してください)。


編集

これが私がしたことです:

1)新しいMVCインターネットアプリケーションを作成します

2)NuGetを介してThinktecture.IdentityModelをインストールします

3)スキャフォールディングを介してモデルとAPIコントローラーを作成します。

public class Goober
{
    public int GooberId { get; set; }
    public string GooberWords { get; set; }
}

4)プロジェクトを実行し、新しいユーザーを作成し、Fiddlerを使用して新しいGooberを作成しました

5)GetGoober(int id)に[Authorize]を追加しました

6)WebApiConfig.csに追加:

var authConfig = new AuthenticationConfiguration();

authConfig.AddBasicAuthentication((userName, password) =>
    Membership.ValidateUser(userName, password));

config.MessageHandlers.Add(new AuthenticationHandler(authConfig));

プロジェクトを実行し、Fiddlerでapi / goober / 1を押すと、401 www-Authenticate:unspecificedが表示されます。しかし、最初にAccountControllerを使用してログインし、次にFiddlerを使用すると、200が得られ、すべてが桃色になります。

編集

さて、問題は私の最初の質問とは関係がないと思います。テンプレートのSimpleMembershipの初期化に関連しているのではないかと思います。プロジェクトを開いてデバッグを実行し、FiddlerでAPIをヒットすると、Authを通過できません。しかし、Webフロントエンドの「登録」リンクをクリックするだけで、Authを通過します。これは、InitializeSimpleMembershipAttributeがAccountControllerで呼び出されるため、コントローラーが呼び出されるまで初期化されないためだと思いますか?


Membership.ValidateUser()の代わりにWebSecurity.Login()を使用しようとしましたが、機能しません。

これを実際に実装する方法に迷っています。誰かアドバイスはありますか?それとも、私はこの問題に間違った角度から取り組んでいるのでしょうか?

4

1 に答える 1

3

ASP.NET メンバーシップ プロバイダーが と互換性がないことは正しいですが、SimpleMembershipProviderサポートSimpleMembershipProviderは行っています。こちらValidateUserを参照してください。SimpleMembership が正しく構成され、初期化されていると仮定すると、引き続き を呼び出すことができるはずです。Membership.ValidateUser()

すでに試してエラーが発生した場合はMembership.ValidateUser()お知らせください。解決を試みます。

アップデート

したがって、再現手順に従って、エラーを特定することができました。ThinktectureAuthenticationHandlerハンドラーをインライン化し、デバッグで実行しました。API コントローラーへの要求から 30 秒後に、データベース接続エラーが発生します。これは非同期かつサイレントに失敗しています。

いくつかいじった後、問題があるのはDefaultConnection接続文字列だと思います。

私のように、デフォルトの接続にはおそらく次のようなファイル名が含まれています: AttachDBFilename=|DataDirectory|\aspnet-MvcApplication3-20121215104323.mdf"

アプリの起動時に登録されたデリゲート内で ValidateUser が呼び出されると (資格情報の検証のために)、解決|DataDirectory|に失敗しているように見えます。このパスを完全な名前に更新することで、接続の問題が解決したことがわかりました。

<connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=aspnet-MvcApplication3-20121215104323;Integrated Security=SSPI;AttachDBFilename=C:\mydatabase\file\path\example\aspnet-MvcApplication-20121215104323.mdf" providerName="System.Data.SqlClient" />
</connectionStrings>

次に、この投稿を見つけましたここ、これは、この時点で AppDomain のデータ ディレクトリが正しく設定されていないことを示しています。

したがって、構成が設定され、接続文字列が適切なファイル パスとユーザー名 "test" およびパスワード "testing" で変更されると、フィドラーを介したこの要求は 200 を取得しました。

GET http://localhost/api/goober/1
User-Agent: Fiddler
Host: localhost
Authorization: Basic dGVzdDp0ZXN0aW5n

余談として

フォーム認証トークンを取得してAPIコントローラーへのアクセスも許可するには、これを追加する必要があることがわかりました。それ以外の場合、Thinkteckture コードは原則を匿名に戻します。

これを追加

authConfig.InheritHostClientIdentity = true;

これに対抗するには(52 行目):

if (_authN.Configuration.InheritHostClientIdentity == false)
{
   //Tracing.Information(Area.HttpAuthentication, "Setting anonymous principal");
   SetPrincipal(Principal.Anonymous);
}
于 2012-12-15T11:19:13.650 に答える