using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using Public.System.Collections;
using Public.Framework.Permissions;
namespace Public.Framework.Identity
{
/// <summary>
/// 为需要有效身份或身份信息的 Web 页面提供基本的操作以使这些 Web 页面可以方便实现身份验证。
/// </summary>
public class SecurityPage : Public.System.Web.UI.PageEx, ISecurityControl
{
#region Implementation for ISecurityControl
/// <summary>
/// 当前访问者信息。
/// </summary>
protected IdentityInfo identityInfoVisitor; // 当前 Web 页面的访问者信息
/// <summary>
/// 当前身份是否有效。
/// </summary>
protected bool boolIsIdentityValid; // true : 当前身份有效
/// <summary>
/// 是否需要一个有效的身份。
/// </summary>
protected bool boolRequireValidIdentity; // true : 需要一个有效的身份
/// <summary>
/// 所需要的全部操作权限。
/// </summary>
protected int[] intRequiredOperations; // 访问此 Web 页面所需要的全部操作权限
/// <summary>
/// 所需要的其中一个操作权限。
/// </summary>
protected int[] intRequiredOneOperations; // 访问此 Web 页面所需要的其中一个操作权限
/// <summary>
/// 所需要的全部数据权限。
/// </summary>
protected int[] intRequiredDatas; // 访问此 Web 页面所需要的全部数据权限
/// <summary>
/// 所需要的其中一个数据权限。
/// </summary>
protected int[] intRequiredOneDatas; // 访问此 Web 页面所需要的其中一个数据权限
/// <summary>
/// 执行安全验证之后的安全验证的结果。
/// </summary>
protected SecurityValidateArgs argsValidateResult; // 表示验证结果
/// <summary>
/// 执行安全验证失败后想要采取的动作。
/// </summary>
protected ValidateFailAction validateFailAction; // 验证失败时的动作
/// <summary>
/// 安全验证事件,当验证访问者身份和权限时发生。
/// </summary>
public event SecurityValidateEventHandler SecurityValidate;
/// <summary>
/// 当验证身份失败并指定了 ValidateFailAction.CauseEvent 时发生。
/// </summary>
public event SecurityValidateEventHandler ValidateFail;
#endregion
#region Implementation for ISecurityControl
/// <summary>
/// 验证访问者身份的有效性。
/// </summary>
/// <param name="autoredirect">当身份无效时是否自动重定向 Web 页面。</param>
/// <param name="alloperations">所需要的全部操作权限。</param>
/// <param name="oneoperations">所需要的其中一个操作权限。</param>
/// <param name="alldatas">所需要的全部数据权限</param>
/// <param name="onedatas">所需要的其中一个数据权限</param>
/// <returns>当访问者身份有效时返回 true,否返回 false。</returns>
public bool ValidateVisitorIdentity(bool autoredirect, int[] alloperations, int[] oneoperations, int[] alldatas, int[] onedatas)
{
if (!boolRequireValidIdentity)
{
return true;
}
if (identityInfoVisitor == null)
{
identityInfoVisitor = IdentityInfo.GetCurrentSessionVisitor();
}
if (!(boolIsIdentityValid = !(identityInfoVisitor == null || !identityInfoVisitor.IsValid())))
{
if (autoredirect || boolRequireValidIdentity) SecurityControl.RedirectPage(SecurityControl.PageUrls.ValidateIdentity);
return false;
}
if (alloperations != null && !IsHoldOperations(alloperations))
{
return false;
}
if (oneoperations != null && !IsHoldOneOperation(oneoperations))
{
return false;
}
if (alldatas != null && !IsHoldDatas(alldatas))
{
return false;
}
if (onedatas != null && !IsHoldOneData(onedatas))
{
return false;
}
return true;
}
/// <summary>
/// 在执行安全验证时引发 SecurityValidate 事件。
/// </summary>
/// <param name="e">包含事件数据的 SecurityValidateArgs。</param>
protected virtual void OnSecurityValidate(SecurityValidateArgs e)
{
argsValidateResult = e;
if (SecurityValidate != null)
{
SecurityValidate(this, e);
}
if (e != null && !e.Result) // 验证失败
{
if (IsFailAction(ValidateFailAction.CauseEvent))
{
if (ValidateFail != null)
{
ValidateFail(this, e);
}
}
if (IsFailAction(ValidateFailAction.HideControl))
{
Visible = false;
}
//if (IsFailAction(ValidateFailAction.DisabledControl))
//{
// // 不支持
//}
if (IsFailAction(ValidateFailAction.ShowMessage))
{
ShowMessage = SecurityControl.ValidateFailMessage;
}
if (IsFailAction(ValidateFailAction.RedirectPage))
{
SecurityControl.RedirectPage(SecurityControl.PageUrls.ValidateFail,
SecurityControl.ValidateFailMessage, SecurityControl.PageUrls.PreviousUrl);
}
if (IsFailAction(ValidateFailAction.ThrowException))
{
throw new Exception(SecurityControl.ValidateFailMessage);
}
}
}
/// <summary>
/// 在页初始化开始时引发 System.Web.UI.Page.PreInit 事件。
/// </summary>
/// <param name="e">包含事件数据的 System.EventArgs。</param>
protected override void OnPreInit(EventArgs e)
{
ValidateVisitor();
base.OnPreInit(e);
}
#region Implementation for ISecurityControl
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using Public.System.Collections;
using Public.Framework.Permissions;
namespace Public.Framework.Identity
{
/// <summary>
/// 为需要有效身份或身份信息的 Web 页面提供基本的操作以使这些 Web 页面可以方便实现身份验证。
/// </summary>
public class SecurityPage : Public.System.Web.UI.PageEx, ISecurityControl
{
#region Implementation for ISecurityControl
/// <summary>
/// 当前访问者信息。
/// </summary>
protected IdentityInfo identityInfoVisitor; // 当前 Web 页面的访问者信息
/// <summary>
/// 当前身份是否有效。
/// </summary>
protected bool boolIsIdentityValid; // true : 当前身份有效
/// <summary>
/// 是否需要一个有效的身份。
/// </summary>
protected bool boolRequireValidIdentity; // true : 需要一个有效的身份
/// <summary>
/// 所需要的全部操作权限。
/// </summary>
protected int[] intRequiredOperations; // 访问此 Web 页面所需要的全部操作权限
/// <summary>
/// 所需要的其中一个操作权限。
/// </summary>
protected int[] intRequiredOneOperations; // 访问此 Web 页面所需要的其中一个操作权限
/// <summary>
/// 所需要的全部数据权限。
/// </summary>
protected int[] intRequiredDatas; // 访问此 Web 页面所需要的全部数据权限
/// <summary>
/// 所需要的其中一个数据权限。
/// </summary>
protected int[] intRequiredOneDatas; // 访问此 Web 页面所需要的其中一个数据权限
/// <summary>
/// 执行安全验证之后的安全验证的结果。
/// </summary>
protected SecurityValidateArgs argsValidateResult; // 表示验证结果
/// <summary>
/// 执行安全验证失败后想要采取的动作。
/// </summary>
protected ValidateFailAction validateFailAction; // 验证失败时的动作
/// <summary>
/// 安全验证事件,当验证访问者身份和权限时发生。
/// </summary>
public event SecurityValidateEventHandler SecurityValidate;
/// <summary>
/// 当验证身份失败并指定了 ValidateFailAction.CauseEvent 时发生。
/// </summary>
public event SecurityValidateEventHandler ValidateFail;
#endregion
#region Implementation for ISecurityControl
/// <summary>
/// 验证访问者身份的有效性。
/// </summary>
/// <param name="autoredirect">当身份无效时是否自动重定向 Web 页面。</param>
/// <param name="alloperations">所需要的全部操作权限。</param>
/// <param name="oneoperations">所需要的其中一个操作权限。</param>
/// <param name="alldatas">所需要的全部数据权限</param>
/// <param name="onedatas">所需要的其中一个数据权限</param>
/// <returns>当访问者身份有效时返回 true,否返回 false。</returns>
public bool ValidateVisitorIdentity(bool autoredirect, int[] alloperations, int[] oneoperations, int[] alldatas, int[] onedatas)
{
if (!boolRequireValidIdentity)
{
return true;
}
if (identityInfoVisitor == null)
{
identityInfoVisitor = IdentityInfo.GetCurrentSessionVisitor();
}
if (!(boolIsIdentityValid = !(identityInfoVisitor == null || !identityInfoVisitor.IsValid())))
{
if (autoredirect || boolRequireValidIdentity) SecurityControl.RedirectPage(SecurityControl.PageUrls.ValidateIdentity);
return false;
}
if (alloperations != null && !IsHoldOperations(alloperations))
{
return false;
}
if (oneoperations != null && !IsHoldOneOperation(oneoperations))
{
return false;
}
if (alldatas != null && !IsHoldDatas(alldatas))
{
return false;
}
if (onedatas != null && !IsHoldOneData(onedatas))
{
return false;
}
return true;
}
/// <summary>
/// 在执行安全验证时引发 SecurityValidate 事件。
/// </summary>
/// <param name="e">包含事件数据的 SecurityValidateArgs。</param>
protected virtual void OnSecurityValidate(SecurityValidateArgs e)
{
argsValidateResult = e;
if (SecurityValidate != null)
{
SecurityValidate(this, e);
}
if (e != null && !e.Result) // 验证失败
{
if (IsFailAction(ValidateFailAction.CauseEvent))
{
if (ValidateFail != null)
{
ValidateFail(this, e);
}
}
if (IsFailAction(ValidateFailAction.HideControl))
{
Visible = false;
}
//if (IsFailAction(ValidateFailAction.DisabledControl))
//{
// // 不支持
//}
if (IsFailAction(ValidateFailAction.ShowMessage))
{
ShowMessage = SecurityControl.ValidateFailMessage;
}
if (IsFailAction(ValidateFailAction.RedirectPage))
{
SecurityControl.RedirectPage(SecurityControl.PageUrls.ValidateFail,
SecurityControl.ValidateFailMessage, SecurityControl.PageUrls.PreviousUrl);
}
if (IsFailAction(ValidateFailAction.ThrowException))
{
throw new Exception(SecurityControl.ValidateFailMessage);
}
}
}
/// <summary>
/// 在页初始化开始时引发 System.Web.UI.Page.PreInit 事件。
/// </summary>
/// <param name="e">包含事件数据的 System.EventArgs。</param>
protected override void OnPreInit(EventArgs e)
{
ValidateVisitor();
base.OnPreInit(e);
}
#region Implementation for ISecurityControl