むりせず♪なまけず? ~ぷろくらすてぃねいたーの言い訳雑記~

よた ときどき .NET  by 刈歩 菜良 CTP

目次

ニュース

C# VB.NET掲示板
C#, VB.NET 掲示板

わんくま同盟ブログ
わんくま同盟ブログ

Web アプリケーションを簡単編集できる無償ツール WebMatrix ダウンロードはこちら

あわせて読みたい

日記カテゴリ

書庫

Blog 利用状況

ユーザ認証のハマりどころ

久々の技術ネタです。( ;^^)ヘ..
てか、まともなんは初めて?? ( ̄□ ̄;)!!

Windows アプリケーション、Web アプリケーションにかかわらず、ユーザー認証を行いたい場合はプリンシパルを使います。いろんなパターンがありますが、ロール(グループ)の認証でよいのならば、一番単純なのがIsInRoleを使った認証。
たとえばこないな具合。

if (myPrincipal.IsInRole(属していなければいけないロール))
{
     // 属してるから認証おつけい!
}
else
{
     // 属してへんがな!エラー処理。
}

たとえば、Dev1 グループに属してへんとできへん処理ややらしたない処理がある場合はIsInRoleの引数に"Dev1"と書けば良いんやね。

と、思ったら大間違い!!

Windows認証でグループを指定する場合は、そのグループが属するドメイン名(ローカルグループの場合はPC名)を指定せないかんのですねぇ。

【正解】
if (myPrincipal.IsInRole("Karubo-PC\\Dev1"))

ほしたらば、ローカルマシンの Administrators グループに属してるかどうか確認したい場合は、

if (myPrincipal.IsInRole("Karubo-PC\\Administrators"))

って書けばよいわけやね。

と、思ったら超間違い!!

そう、ここがまさにハマりどころ!!

Administratorsをはじめ、UsersなどのOS標準のグループはビルトイングループと呼ばれてるんやけど、ビルトイングループで認証をする場合はPC名ぢゃなくってBUILTINと書かなければいかんのよねぇ。

【正解】
if (myPrincipal.IsInRole("BUILTIN\\Administrators"))

ちなみにちなみに、.NET2.0からはローカルグループやビルトイングループの認証の場合は、ロール名(グループ名)だけでよくなったみたい。

今回はIsInRoleでの認証を例に紹介しましたが、宣言セキュリティ(PrincipalPermission属性)や強制セキュリティ(PrincipalPermissionクラス)でロールを指定する場合もおんなじですよ。

去年の夏にわたくしはここで1~2週間ハマりましたわ。だって、MSDNライブラリのIsInRoleのとこ見てもそんなことひとっことも書いてくれてへんのやもん。もち、フィードバックしときましたが...


参考までにサンプルプログラムおば、

【サンプルコーナー】

【Windows アプリ編】
・Windowsフォームのプロジェクトを作成

・フォームにラベル2つとテキストボックス、ボタンをはっつける。名前はデフォルトのまんま。2つめのラベル(label2)は結果表示用なので、下のほうに大きくはっつけてください。

・ボタンをダブルクリックしてイベントハンドラ作成。

・コードファイルの先頭行に以下の2行を追加

using System.Security.Principal;
using System.Threading;

・コンストラクタ(public Form1()って書いてるとこね。)に以下の1行を追加

Thread.CurrentPrincipal = new WindowsPrincipal(WindowsIdentity.GetCurrent());

・button1_Clickイベントハンドラに以下を追加

IPrincipal myPrincipal = Thread.CurrentPrincipal;
label2.Text = textBox1.Text + "に属して";
if (myPrincipal.IsInRole(textBox1.Text))
{
     label2.Text += "います。";
}
else
{
     label2.Text += "いません。";
}

・で、完成!後は実行して、テキストボックスにロールを入れてボタンをクリックして下さいまし。2005の人はAdministratorsと入れただけで認証が通りますが、2003以前の方だとBUILTIN\Administratorsと入れないと認証が通りませんよ。

【Web アプリ編】
・Webフォームのプロジェクトを作成。作成場所はファイルシステムでもIIS上でもかまいませんが、IIS上に作った場合はIISの設定で統合Windows認証を有効にしてください。
(管理ツール→[インターネットインフォメーションサービス]を起動。Webアプリのフォルダで右クリック→プロパティ。[ディレクトリ セキュリティ]タブの「匿名アクセスおよび認証コントロール」のところにある[編集]ボタンをクリック。一番下の[統合Windows認証]をチェック)

・フォームにテキストボックス、ボタン、ラベルをはっつける。名前はデフォルトのまんま。ラベル(Label1)は結果表示用なので、改行してはっつけてください。2005の方で面倒くさい方は以下のコードをコピーして<div>の下に貼り付けてもOK。

ロール名を入力してください:<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" Text="ロールチェック" OnClick="Button1_Click" /><br />
<br />
<asp:Label ID="Label1" runat="server"></asp:Label>

・ボタンをダブルクリックしてイベントハンドラ作成して以下を追加

Label1.Text = TextBox1.Text + "に属して";
if (User.IsInRole(TextBox1.Text))
{
     Label1.Text += "います。";
}
else
{
     Label1.Text += "いません。";
}

・Web.configがなければ新規に追加して、<system.web>要素内に以下を追加。

<identity impersonate="true"/>
<authorization>
   <deny users="?"/>
</authorization>

・で、完成!後は実行して、テキストボックスにロールを入れてボタンをクリックして下さいまし。2005の人はAdministratorsと入れただけで認証が通りますが、2003以前の方だとBUILTIN\Administratorsと入れないと認証が通りませんよ。

投稿日時 : 2006年10月24日 16:43

Feedback

# re: ユーザ認証のハマりどころ 2007/02/27 16:01 sk

いままさにこれにハマっておりましてとても参考になりました!!

# re: ユーザ認証のハマりどころ 2007/03/01 0:28 刈歩 菜良

sk 様
コメントありがとうございます。
お力になれて光栄です。

タイトル
名前
Url
コメント