2

e.Authenticatedカスタム認証メカニズム (プログラムで onに設定) でフォーム認証を使用する ASP.NET Web サイトに取り組んでいますprotected void Login_Authenticate(object sender, AuthenticateEventArgs e)

ASP.NET サイトマップがあります。一部の要素は、ログインしているユーザーにのみ表示する必要があります。その他は、1 人の一意のユーザー (つまり、変更されることのないユーザー名で識別される管理者) に対してのみ表示する必要があります。

避けたいこと:

  • カスタム ロール プロバイダーを設定します。このような基本的なことを記述するにはコードが多すぎます。
  • たとえば、サイトマップを削除してコード ビハインド ソリューションに置き換えるなど、既存のコードを変換します。

私がしたいこと:

  • 認証イベントでロールを割り当てることができる純粋なコード ビハインド ソリューション。

出来ますか?どのように?そうでない場合、簡単に実行できる回避策はありますか?

4

2 に答える 2

4

マシューが言うように、プリンシパルを構築し、適切なタイミングで自分で設定することは、SiteMapのような組み込みのロールベースの機能をすべて利用する最も簡単な方法です。

しかし、MSDNで示されているよりも、これを実装するためのはるかに簡単な標準ベースの方法があります。

これは私が単純な役割プロバイダーを実装する方法です

Global.asax

using System;
using System.Collections.Specialized;
using System.Security.Principal;
using System.Threading;
using System.Web;
using System.Web.Security;

namespace SimpleRoles
{
    public class Global : HttpApplication
    {
        private static readonly NameValueCollection Roles =
            new NameValueCollection(StringComparer.InvariantCultureIgnoreCase)
                {
                    {"administrator", "admins"},
                    // note, a user can be in more than one role
                    {"administrator", "codePoets"},
                };

        protected void Application_AuthenticateRequest(object sender, EventArgs e)
        {
            HttpCookie cookie = Request.Cookies[FormsAuthentication.FormsCookieName];
            if (cookie != null)
            {
                FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookie.Value);
                Context.User = Thread.CurrentPrincipal =
                               new GenericPrincipal(Context.User.Identity, Roles.GetValues(ticket.Name));
            }
        }
    }
}

ページコードビハインドのコンテキストでユーザーを手動でチェックするには:

if (User.IsInRole("admins"))
{
  // allow something
}

他の場所では、ユーザーを現在のコンテキストから解放します

if (HttpContext.Current.User.IsInRole("admins"))
{
  // allow something
}
于 2010-05-01T14:46:17.600 に答える
2

マイクロソフトが推奨する次の手法を使用します。

http://msdn.microsoft.com/en-us/library/aa302399.aspx

グローバル asax では、auth cookie をインターセプトし、スレッドの原則と HttpContext ユーザーとその役割を設定します。HttpContext.Current.User.IsInRole("foo") を使用できるようになった後、これは WinForm で使用するものとほぼ同じ種類のコードです。

組み込みのパターンを信頼できるほど、それが安全である可能性が高くなり、保守開発者がそのパターンの使用方法を認識できる可能性が高くなります。

于 2010-05-01T14:14:26.847 に答える