Asp.Net Windows認証

Windows認証

ページ要求を行っている認証されたユーザの情報
プロセスを実行しているユーザの情報
を表示するページを用意して、認証方法を変えて確認。

テスト用にTestUserというアカウントを用意した。
runasでTestUserでIEを起動してテストサイトにアクセスした。
C:\Program Files\Microsoft Visual Studio 9.0\VC>runas /user:Gerbera\TestUser "C\Program Files\Internet Explorer\iexplore.exe"

01
IIS認証方法
匿名アクセス

page.html、page.aspxのACL
IUSER_XXX
ASP.NET

まぁこれはうまくいく。
認証されたアカウントはIsAnonymousだけど、プロセスを実装しているユーザはASP.NETなのは注意。





02
IIS認証方法
匿名アクセス許可

page.html、page.aspxのACL
ASP.NET

page.html、page.aspxともにアクセス失敗。
page.htmlは単純にIUSER_XXXでアクセスにいったが、アクセスが許可されていないので失敗。
page.aspxはasp.netがIUSER_XXXAclのチェックにいって失敗。





03
IIS認証方法
匿名アクセス許可

page.html、page.aspxのACL
IUSER_XXX

page.htmlはIUSER_XXXのアクセスが許可されているから表示できる。
page.aspxはasp.netのアクセス許可がないのでエラーになっている。





04
IIS認証方法
windows統合認証

page.html、page.aspxのACL
ASP.NET
TestUser

これはうまくいく。
認証されたユーザがTestUserになっている。
プロセスを実行しているユーザはやっぱりASP.NET





05
IIS認証方法
windows統合認証

page.html、page.aspxのACL
ASP.NET
TestUserはアクセスできないので、ダイアログがでた。
このダイアログでアクセス権のあるユーザでログインすればその後のページも表示される。





06
IIS認証方法
windows統合認証

page.html、page.aspxのACL
TestUser

page.htmlはTestUserのアクセスが許可されているから表示できる。
page.aspxはasp.netのアクセス許可がないのでエラーになっている。





07
IIS認証方法
windows統合認証
impersonate="false"

偽装を有効にした。
認証されたユーザもプロセスを実行しているユーザTestUserになった。


ソース
default.aspx


<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>認証テスト</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
            <a href="page.html">page.html</a>
            <a href="page.aspx">page.aspx</a>
    </div>
    </form>
</body>
</html>

default.aspx.cs

using System;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Security;
using System.Security.Principal;

public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Response.Write("ページ要求を行っている認証されたユーザの情報");
        Response.Write("<hr>");
        IIdentity iid = User.Identity;
        iid.GetType().GetProperties().Where(
            pi => pi.Name == "AuthenticationType" || 
                pi.Name == "ImpersonationLevel" || 
                pi.Name == "IsAuthenticated" || 
                pi.Name == "IsGuest" || 
                pi.Name == "IsSystem" || 
                pi.Name == "IsAnonymous" || 
                pi.Name == "Name" || 
                pi.Name == "Groups").ToList().ForEach(
            pi => this.Response.Write(pi.Name + ":" + pi.GetValue(iid, null) + "<br>"));

        //グループも表示
        //iid.GetType().GetProperties().Where(
        //    pi => pi.Name == "Groups").ToList().ForEach(
        //    pic =>
        //    {
        //        IdentityReferenceCollection ic = pic.GetValue(iid, null) as IdentityReferenceCollection;
        //        if (ic == null)
        //        {
        //            return;
        //        }

        //        ic.OfType<System.Security.Principal.IdentityReference>()
        //            .ToList().ForEach(
        //                t => Response.Write(t.Value + "<br>"+ t.Translate(typeof( NTAccount)).Value + "<br>"));
        //    });

        Response.Write("<br>");
        Response.Write("<br>");
        Response.Write("プロセスを実行しているユーザの情報");
        Response.Write("<hr>");
        WindowsIdentity wi = WindowsIdentity.GetCurrent();
        wi.GetType().GetProperties().Where(
            pi => pi.Name == "AuthenticationType" || 
                pi.Name == "ImpersonationLevel" || 
                pi.Name == "IsAuthenticated" || 
                pi.Name == "IsGuest" || 
                pi.Name == "IsSystem" || 
                pi.Name == "IsAnonymous" || 
                pi.Name == "Name" || 
                pi.Name == "Groups").ToList().ForEach(
            pi => this.Response.Write(pi.Name + ":" + pi.GetValue(wi,null) + "<br>"));
    }
}

page.aspx

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Page</title>
</head>
<body>
<h1>Page.aspx</h1>
</body>
</html>

page.html
<hr>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Page</title>
</head>
<body>
<h1>Page.html</h1>
</body>
</html>