2009-10-31 13 views
5

カスタムメンバーシッププロバイダをASP.NET MVC [Authorize()]属性と結びつけるにはどうすればよいですか?私はカスタムメンバーシッププロバイダの作成方法に関するチュートリアルを多数爆破しましたが、アプリケーションに接続する方法に関するすべての情報は、通常のASP.NET WebFormsアプリケーションの周りを回っているようですケーキのASP.NET MVCアプリケーションにカスタムメンバーシッププロバイダを追加するにはどうすればよいですか?

ASP.NET MVCでうまくいく「マジック」の量が増えていますが、私はWebFormsの方法でプラグインするのに慣れています。私の心のベンダー。どのように私は重い吊り上げをすることになっているか、または私はそれが魔法によって起こっているに依存することになっていることを知っていますか?

どこのプロバイダをMVCアプリに結び付けますか?それが[Authorize()]属性を介して呼び出されたと仮定して、私はそれが繋がれるのですか?

答えて

6

あなたの混乱に役立たないことが実際に何も起こっていないことを説明していないので、他の回答よりもいくらか明確に説明してください。

まずアップ、あなたはすでにやった事の音からのカスタムプロバイダーを実装するので、私はほんの少しのコードスニペットを投げるだろうとここにさらに詳細には触れません。

using System.Web.Security; 

public class MyCustomMembershipProvider : MembershipProvider 
{ 
    public override bool ValidateUser(string username, string password) 
    { 
     if (username.Equals("BenAlabaster") && password.Equals("Elephant")) 
      return true; 

     return false; 
    } 

    /* Override all the other methods required to extend MembershipProvider */   
} 

そして、あなたがベースのMembershipProviderを設定する属性を移入することを確認すること、あなたのweb.configファイルで、あなたのプロバイダを設定します。

<membership defaultProvider="MyCustomMembershipProvider">  
    <providers>   
     <clear />   
     <add name="MyCustomMembershipProvider" 
      type="MyNamespace.MyCustomMembershipProvider" 
      enablePasswordRetrieval="false" 
      enablePasswordReset="true"   
      requiresQuestionAndAnswer="false"   
      requiresUniqueEmail="true"   
      passwordFormat="Hashed"   
      maxInvalidPasswordAttempts="10"   
      minRequiredPasswordLength="6"   
      minRequiredNonalphanumericCharacters="0"   
      passwordAttemptWindow="10"   
      passwordStrengthRegularExpression=""   
      applicationName="/" />  
    </providers>  
</membership> 

次のビット、私はあなたが、実際にタイでのWebアプリケーションへのoverthinkingていると思います。 WebFormsアプリケーションでは、自分で残りの部分をコード化する必要がありますが、MVCフレームワークでは残りの部分を処理する必要があります。アクションメソッドに[Authorize]属性を追加するだけです。フレームワークは、ログインし、ログインページにリダイレクトしない場合は、それは、web.configファイルで構成されているものだとして、ユーザーがログに記録されますので、ログインページは、カスタムプロバイダを見つけるあなたはユーザーオブジェクト参照することにより、あなたのコントローラからログインしているユーザーについての情報にアクセスすることができます。

public class WhateverController : Controller 
{ 
    [Authorize] 
    public ActionResult WhateverAction() 
    { 
     ViewData["LoggedInAs"] = string.Format("You are logged in as {0}.", User.Identity.Name); 
     Return View(); 
    } 
} 

この操作では、ユーザーがログインし、ページに表示されるWhatever/WhateverAction.aspxビューにユーザー情報を表示する必要があります。

+0

さて、それは理にかなっています。私はちょうど2つと2つ一緒に入れていませんでした。私はまだそのWebFormsのフレームの枠組みにこだわっていて、MVCがそれをいつ行うのか、そして自分でそれを処理しなければならないのか分かっていません。 – BobTheBuilder

0

このカスタムメンバーシップでどのくらい変更しましたか?あなたはテーブルの名前を変えたのですか?あなたはユーザーをログインさせることができますか?つまり、あなたのカスタムメンバーシップは働いていますか?

ロールテーブルの名前を別のものに変更した場合や、Authroizeタグをオーバーライドする必要がある場合など、たくさんのものを変更した場合は、

カスタムメンバーシップが機能していない場合は、正しく構成されていない可能性があり、設定はwebformsと同じです。あなたはwebconfigをセットアップするだけです。

</authentication> 
    <membership> 
     <providers> 
     <clear /> 
     <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="ConnectionString" 
     enablePasswordRetrieval="false" 
     enablePasswordReset="true" 
      requiresQuestionAndAnswer="false" 
      requiresUniqueEmail="true" 
      passwordFormat="Hashed" 
      maxInvalidPasswordAttempts="10" 
      minRequiredPasswordLength="6" 
      minRequiredNonalphanumericCharacters="0" 
      passwordAttemptWindow="10" 
      passwordStrengthRegularExpression="" 
      applicationName="/" /> 
     </providers> 
    </membership> 
    <profile> 
     <providers> 
     <clear /> 
     <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="ConnectionString" applicationName="/" /> 
     </providers> 
    </profile> 
    <roleManager enabled="true"> 
     <providers> 
     <clear /> 
     <add connectionStringName="ConnectionString" 
      applicationName="/" name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> 
     <add applicationName="/" name="AspNetWindowsTokenRoleProvider" 
      type="System.Web.Security.WindowsTokenRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> 
     </providers> 
    </roleManager> 
+0

「私たちは何を変えていましたか」と言いましたが、私たちは何も変えず、ASP.NET MVCウィザードがあなたのために設定するものではなく、既存のユーザーデータベースを使用しています。正直言ってチュートリアル1を使用するつもりはなく、私たちのニーズに必要以上に複雑で、ビジネスモデルのニーズを満たしていません。だから私はメンバーシッププロバイダを書いてきました...私が迷っているのは、私がweb.configで指定したカスタムプロバイダをWebアプリケーションのコードベースにどのようにフックするのですか? – BobTheBuilder

+0

私があなたに与えたことは、カスタムプロバイダを使ってカスタムデータベースをセットアップすることです。あなたはaspnet_UserInRolesを使用しているようなあなたのテーブルを一覧表示できますか? aspnet_userと接頭辞aspnetが付いているテーブルはありますか? – chobo2

1

マイカスタムメンバシッププロバイダがweb.configファイルで参照されています。

<membership defaultProvider="MyMembershipProvider"> 
    <providers> 
    <clear/> 
    <add name="MyMembershipProvider" type="Namespace.MyMembershipProvider, Namespace" connectionStringName="connstring" [...] /> 
    </providers> 
</membership> 

それからちょうど静的メンバーシップクラスを使用します。

+0

クール - web.configで倍数を指定するのを止めるにはどうすればいいのですか?また、Webアプリケーションのどこで動作させるのですか? – BobTheBuilder

+0

実際に複数のメンバーシッププロバイダを指定することができます。これがdefaultProviderを指定する必要がある理由です。私は複数のプロバイダのユーティリティが複雑な認証メカニズムでしか見られないように感じます。しかし、コードでプロバイダをリストするには、web.cofigで指定されたメンバーシッププロバイダのコレクションを返すSystem.Web.Security.Membership.Providersプロパティを単純に使用します。 zowensが書いた通り – zowens

+0

。 実際には、通常の方法で自分の既知のプロバイダをインスタンス化できます。 MembershipProvider mp = new MyMembershipProvider(); またはMembership.Providers – twk

関連する問題