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>