3

サイトを構築していますが、サイトの一部(管理者部分)を通常の公開表示から制限したいと思います。

  • データベースアクセスにLINQを使用しています。
  • LINQを介してデータベースへの呼び出しを処理するServiceクラスがあります
  • ログイン部分を除いて、サイト全体を実行しています。

これまでのところ、MembershipProviderやRoleProvidersなどを使用した例しか見つけることができませんでした。正直なところ、私が望むものにはあまりにも多くの作業が必要なようです。入力フィールドに正しいパスワードを入力すると、入力できるようになります。

私は本当にプロバイダーを避けられないのですか?

4

4 に答える 4

6

ユーザーは1人だけなので、データベースの依存関係を作成する必要はありません。ハードコードされた資格情報に基づいて、非常に単純な認証サービスを作成できます。例えば、

public class AuthorizationService{
     private AuthorizationService(){}
     public static readonly AuthorizationService Instance = new AuthorizationService();

     private const string HardCodedAdminUsername = "someone";
     private const string HardCodedAdminPassword = "secret";
     private readonly string AuthorizationKey = "ADMIN_AUTHORIZATION";

     public bool Login(string username, string password, HttpSessionStateBase session){
         if(username.ToLowerInvariant().Trim()==HardCodedAdminUsername && password.ToLowerInvariant().Trim()==HardCodedAdminPassword){
              session[AuthorizationKey] = true;
              return true;
         } 
         return false;
     }

     public void Logout(HttpSessionStateBase session){
        session[AuthorizationKey] = false;
     }

     public bool IsAdmin(HttpSessionStateBase session){
         return session[AuthorizationKey] == true;
     }
}

IAuthorizationFilter次に、次のようなカスタムを作成できます。

public class SimpleAuthFilterAttribute: FilterAttribute, IAuthorizationFilter{
     public void OnAuthorization(AuthorizationContext filterContext){
         if(!AuthorizationService.Instance.IsAdmin(filterContext.HttpContext.Session)){
              throw new UnauthorizedAccessException();
         }
     }
}

次に、保護されたコントローラーのアクションをで装飾するだけで、SimpleAuthFilterアプリケーションのログインが突然機能します。わーい!(注:このコードはすべてStackOverflowの回答ウィンドウで記述したため、実際に機能する前にタイプミスなどをクリーンアップする必要がある場合があります

また、これをリファクタリングして、不要な場合はユーザー名を省略することもできます。保護されたコントローラーアクションにアクセスできるようにする場合は、に対応する呼び出しを行うコントローラーアクションLoginを作成する必要があります。LogoutAuthorizationService

于 2011-06-18T19:32:44.457 に答える
3

最小限の実装で軽量のメンバーシッププロバイダーを構築する価値があります。GetUser、ValidateUserなどのメソッド。全部を実装する必要はありません。必要に応じて、ページの承認とUser.Identityなどの確認に役立ちます。また、これを行うためにRoleProviderまたはProfileProviderは必要ありません。

また、将来に向けてスケーラブルです。

アップデート

ユーザーを評価して取得し、独自の検証/データアクセスコードを挿入するためのコアメソッドを実装する必要があります。

このようなもの....

web.config設定:

<membership defaultProvider="ApplicationMembershipProvider">
      <providers>
        <clear/>
        <add name="ApplicationMembershipProvider" type="YourNamespace.ApplicationMembershipProvider"/>
      </providers>
    </membership>

ログインコード:

if (Membership.ValidateUser(username, password))
            {
                FormsAuthentication.SetAuthCookie(username, false);
}
于 2011-06-18T19:13:26.077 に答える
0

@KristianB少し前に、私はこのSOの質問に答えました。実装は非常に簡単であると同時に、コードにユーザー名とパスワードをハードコーディングするよりも優れているため、便利な場合があると思います。

幸運を!

于 2011-06-18T22:35:37.737 に答える
0

セッション変数でステータス(ログインしているかどうか)を設定できます。ユーザーが正しいパスワードを入力した場合は変数をtrueに設定し、アクセスを制限するすべてのページで、変数がtrueかどうかを確認します。

于 2011-06-18T19:13:16.587 に答える