10.1 在多个服务器上使用窗体身份验证
配置machine.config
<machinekey
validationKey="61EA54E00591533201~~~~~~~~~~~~~~~"
decryptionKey="~~~~~~~~~~~~~~`"
validation="SHA1"/>
validationKey值的长度应该在40到128个字符之间
decryptionKey值可以是16个字符长也可以是48个字符长 如果使用16个就会是标准的DES(数据加密标准)加密方法。如果定义的是48个字符,就会使用Triple DES(或3DES)加密方法
validation可以定义检验身份验证票证和viewstate值的算法,我们可以把他设置为"SHA1""MD5""3DES" Triple DES(3DES)身份验证票证检验将使用SHA1因为他不支持3DES
使用 3DES时(decryptionKey值的长度为48个字符)ASP.NET还可以检查decryptionKey并没有使用非常不安全的值
10.11 在非Web Farm中使用这些方法
实例:
1 创建两个Web应用程序,一个需要用户登录才可以使用一个则可以接受匿名这些应用程序可以位于不同的机器也可以是相同机器上各自独立的应用程序
第一个应用程序:
web.config
<authentication mode="Forms">
<forms name="MultipleAppsPrivate"
loginUrl="login.aspx"
timeout="30"
path="/"
protection="All">
<credentials passwordFormat="Clear">
<user name="dan" password="qianqian"></user>
<user name="dan2" password="qianqian"></user>
</credentials>
</forms>
</authentication>
<authorization>
<!--<allow users="*" />--> <!-- 允许所有用户 -->
<!-- <allow users="[逗号分隔的用户列表]"
roles="[逗号分隔的角色列表]"/>
<deny users="[逗号分隔的用户列表]"
roles="[逗号分隔的角色列表]"/>
-->
<deny users="?" />
</authorization>
<machineKey validation="SHA1"
validationKey="61EA54E005915332011232149A2EEB317586824B26CCDB3AD9ABDBE9D6F24B0625547769E835539AD3882D3DA88896EA531CC7AFE664866BD5242FC2B05D"
decryptionKey="61EA54E005915332011232149A2EEB317586824B265337AF"
>
</machineKey>
login.aspx
private void loginButton_Click(object sender, System.EventArgs e)
{//登录
if(FormsAuthentication.Authenticate(name.Text.Trim(),pass.Text.Trim()))
{
FormsAuthentication.RedirectFromLoginPage(name.Text,false);
}
else{
err.Text="用户名或密码错误";
}
}
第二个应用程序:
<authentication mode="Forms">
<forms name="MultipleAppsPrivate"
loginUrl="login.aspx"
timeout="30"
path="/"
protection="All">
</forms>
</authentication>
<authorization>
<allow users="*" /> <!-- 允许所有用户 -->
<!-- <allow users="[逗号分隔的用户列表]"
roles="[逗号分隔的角色列表]"/>
<deny users="[逗号分隔的用户列表]"
roles="[逗号分隔的角色列表]"/>
-->
</authorization>
<machineKey validation="SHA1"
validationKey="61EA54E005915332011232149A2EEB317586824B26CCDB3AD9ABDBE9D6F24B0625547769E835539AD3882D3DA88896EA531CC7AFE664866BD5242FC2B05D"
decryptionKey="61EA54E005915332011232149A2EEB317586824B265337AF"
>
</machineKey>
index.aspx
if(Request.IsAuthenticated)
{
show.Visible=true;
}
10.12 随机生成机器密钥
private void create_Click(object sender, System.EventArgs e)
{//生成密码
des.Text=CreateMachineKey(16);
des3.Text=CreateMachineKey(64);
key.Text=CreateMachineKey(128);
}
public static string CreateMachineKey(int length){
//Create a byte array
byte[] random=new Byte[length/2];
//create a cryptographically strong random number generator
RNGCryptoServiceProvider rng=new RNGCryptoServiceProvider();
rng.GetBytes(random);
//create a StringBuilder to hold the result
System.Text.StringBuilder machineKey=new System.Text.StringBuilder(length);
//loop through the random byte array and append to the StringBuilder
for(int i=0;i<random.Length;i++){
machineKey.Append(String.Format("{0:X2}",random[i]));
}
return machineKey.ToString();
}
10.2 不带Cookies的窗体身份验证
浏览器 Web服务器和代理服务器都会对URL 中的字符数进行限制例如IE5.5只能支持2048个字符
10.3 保护.aspx页面及其内容
10.3.1 性能问题
10.3.2 与文件类型有关的问题
关于.pdf等文件不能重定向的问题
10.4 向身份票证添加附加信息
10.5 构建窗体身份验证以支持基于交色的授权
10.6 防止Cookie被盗
1 监控访问Web应用程序的客户IP地址
10.7 保存登录用户列表
web.config
<authentication mode="Forms">
<forms name="UserList"
loginUrl="login.aspx"
timeout="30"
path="/"
>
<credentials passwordFormat="Clear">
<user name="dan" password="qianqian"></user>
<user name="dan2" password="qianqian"></user>
</credentials>
</forms>
</authentication>
<authorization>
<deny users="?" /> <!-- 允许所有用户 -->
<!-- <allow users="[逗号分隔的用户列表]"
roles="[逗号分隔的角色列表]"/>
<deny users="[逗号分隔的用户列表]"
roles="[逗号分隔的角色列表]"/>
-->
</authorization>
login.aspx
<asp:DataList id="userList" runat="server">
<ItemTemplate>
<%#DataBinder.Eval(Container,"DataItem")%>
</ItemTemplate>
</asp:DataList>
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
if(Request.IsAuthenticated==true)
{
DisplayLogout();
member.Text=((Hashtable)Application["CurrentUsers"]).Count.ToString();
guest.Text=Application["AnonymousUsers"].ToString();
if(((Hashtable)Application["CurrentUsers"]).Count>0)
{
userList.DataSource=((Hashtable)Application["CurrentUsers"]).Values;
}
else{
string[] noUsers={"No users logged in"};
userList.DataSource=noUsers;
}
userList.DataBind();
}
else{
DisplayLogin();
}
}
private void DisplayLogout(){
loginPanel.Visible=false;
logoutPanel.Visible=true;
}
private void DisplayLogin()
{
loginPanel.Visible=true;
logoutPanel.Visible=false;
}
private void login_Button_Click(object sender, System.EventArgs e)
{//登录
if(FormsAuthentication.Authenticate(name.Text,pass.Text))
{
((Hashtable)Application["CurrentUsers"]).Add(Session.SessionID,name.Text);
Application["AnonymousUsers"]=Convert.ToInt16(Application["AnonymousUsers"])-1;
FormsAuthentication.RedirectFromLoginPage(name.Text,false);
}
}
private void logoutButton_Click(object sender, System.EventArgs e)
{//注销
if(((Hashtable)Application["CurrentUsers"]).Contains(Session.SessionID))
{
((Hashtable)Application["CurrentUsers"]).Remove(Session.SessionID);
Application["AnonymousUsers"]=Convert.ToInt16(Application["AnonymousUsers"])+1;
}
FormsAuthentication.SignOut();
DisplayLogin();
}
10.8 提供多个登录页面