EPR类企业管理系统

在我们现有系统基础上或全新开发,提供定制服务
为您的企业高效快速实施ERP,WMS,MES,CRM管理系统
全面管控物料仓库、销售业务、采购业务、仓库业务
生产过程、质量检验、组织架构、业务报表


定制
QQ:460-3528

开发
QQ群:3360-90194

源码
微信:136-3650-3721

使用ASP.NET应用程序中的登录窗口进行用户身份验证

本主题详细介绍从创建和初始化WebApplication对象到最终用户向应用程序认证为止执行的步骤。根据安全系统在您的应用程序中使用的身份验证策略,可以要求最终用户在登录窗口中键入凭据以进行身份​​验证。XAF中有两种内置的身份验证策略。该AuthenticationStandard进行身份验证最终用户在登录窗口中输入的信息。该AuthenticationActiveDirectory不需要显示登录窗口。它从系统的活动目录中获取所需的信息。本主题详细说明使用内置的AuthenticationStandard策略时如何对最终用户进行身份验证。若要了解使用内置AuthenticationActiveDirectory策略时采取的步骤,请参阅ASP.NET应用程序中的“没有登录窗口的用户身份验证”主题。您可以自定义AuthenticationActiveDirectory,以便显示登录窗口并将其中键入的信息用于身份验证。在这种情况下,请阅读本主题以了解登录窗口的显示方式。

创建登录视图

阶段说明

干预方式

由存储在应用程序模型的视图” | “视图”中的信息创建“详细视图”。<LogonParameters_class_name> _DetailView节点。此详细信息视图表示由安全系统的Authentication对象的LogonParametersType属性指定的类型的新创建的对象。对象的属性由上次运行应用程序时键入的值初始化。在对用户进行身份验证之后,这些值将保存到“应用程序模型”的“登录”节点。

如果您要求在登录窗口中请求自定义信息,请指定一个自定义LogonParameters类。为此,在Program.Main方法中调用XafApplication.Setup方法之前,请设置安全系统使用的Authentication对象的LogonParametersType属性。如果您的LogonParameters需要自定义身份验证技术,请实施Authentication类,该类是从AuthenticationBase类派生的。有关详细信息,请参阅“如何:使用自定义登录参数和身份验证”主题。

默认情况下,使用自定义对象空间创建指定LogonParameters类型的对象,该对象空间将对象存储在内存中并且不连接到数据库。如果需要访问数据库以表示登录窗口中的自定义LogonParameters对象,请创建IObjectSpace类型的对象空间。为此,请在应用程序中处理XafApplication.CreateCustomLogonWindowObjectSpace事件。如何:使用自定义登录参数和身份验证主题中介绍了此方案的示例。

默认情况下,由经过身份验证的用户指定的值将保存到SettingsStorageOnCookies存储中,以便在下次运行应用程序时读取它们。该存储将凭据保存到cookie。您可以通过继承SettingsStorage类来实现自定义存储。要使用此存储而不是默认存储,请处理XafApplication.CreateCustomLogonParameterStore事件。

您可以在值之前和之后访问LogonParameters对象,这些值在上次运行应用程序时保存。为此,分别处理XafApplication.LastLogonParametersReadingXafApplication.LastLogonParametersRead事件。或者,您可以重写XafApplication.ReadLastLogonParametersCore方法以实现用于读取这些值的自定义技术。

您可以自定义表示LoginParameters对象的详细信息视图。为此,请使用“视图” | “视图”。模型编辑器中的<LogonParameters_class_name> _DetailView节点。例如,您可以更改“查看项目”布局或执行本地化。

创建的View的DetailView.ViewEditMode属性设置为Edit

创建登录窗口

MainWindowWin1

阶段说明

干预方式

在创建Window类的实例之前,需要创建所需的Controller。

如果您需要自定义按钮添加到登录窗口,或自定义默认的行为,实现自定义对话框控制器从继承WebLogonController对话控制器。要替换默认的WebLogonController,请在WebApplication后代中重写CreateLogonController方法。

默认情况下,仅创建足以用于登录窗口的控制器。您可以创建额外的控制器。为此,请在WebApplication类中处理XafApplication.CreateCustomLogonWindowControllers事件。返回已创建控制器的列表。请注意,可视化登录窗口的默认模板仅包含PopupAction的操作容器。因此,必须将Controller中的Action映射到此Action Container才能进行可视化(请参阅ActionBase.Category)。

订阅Controller.AfterConstruction事件以设置Controller的属性。例如,您可以指定激活控制器要满足的条件。

然后,创建一个窗口,并在其中注册所有创建的控制器。这意味着它们的WindowController.Window属性设置为当前的Window对象。

订阅Controller.FrameAssigned事件,以访问Controller的Window(请参见WindowController.Window)并对其执行所需的操作。例如,在事件处理程序中,您可以订阅激活Controller之前引发的事件。

代表WindowController类的后代的Controller被一个接一个地激活。

要仅激活用于登录窗口的窗口控制器,请将一个项目添加到Controller.Active集合中。作为项目的,传递一个表达式,该表达式在当前Window包含LogonController时设置为true

重写Controller的WindowChanging方法,以取消激活。将一个项目添加到Controller.Active集合中,并传递false作为该项目的value

订阅Controller.Activated事件。这是使用控制器执行所需功能的主要方法。

将视图分配给窗口

MainWindow2Web

阶段说明

干预方式

创建的视图将分配给登录窗口。

订阅Frame.ViewChangingFrame.ViewChanged事件。您可以在Widow Controller的Controller.Activated事件处理程序或View Controller的Controller.FrameAssigned事件处理程序中执行此操作。

登录窗口的Frame.Controllers集合中的View Controllers被激活。

您可以使用以下属性来管理View Controller的激活:ViewController.TargetViewTypeViewController.TargetViewNestingViewController.TargetObjectTypeViewController.TargetViewId

重写Controller的ViewChanging方法以取消激活。将一个项目添加到Controller.Active集合中,并传递false作为该项目的value

订阅Controller.Activated事件。这是使用Controller执行所需功能的主要条目。

将登录模板分配给窗口

LogonWindow3Web

阶段说明 干预方式
的Login.aspx页面加载。该页面实现IWindowTemplate接口,以支持XAF体系结构。加载后,此页面将作为模板分配给登录窗口。 您可以根据需要自定义Logon.aspx页。该页面在XAF解决方案的ASP.NET应用程序项目中可用。

动作控件已创建

LogonWindow4Web

阶段说明 干预方式
Window的TemplateChanged事件引发。此事件由已激活的FillActionContainersController处理,因为它表示窗口控制器。该TemplateChanged事件处理程序寄存器操作在窗口的模板的行动容器。每个动作均在应用程序模型的ActionDesign | ActionScript中映射到的动作容器中注册。ActionToContainerMapping节点。动作容器为其动作创建控件。 订阅Frame.TemplateChanged事件以访问登录窗口的模板及其操作容器。为此,请使用窗口控制器的Controller.Activated事件。

将窗口的视图分配给模板

LogonWindow5Web

阶段说明 干预方式
视图被分配给当前窗口的模板。这将强制创建View的控件(请参见View.CreateControls)。将该控件添加到模板的ViewSite中。 处理View.ControlsCreatingView.ControlsCreated事件,以在创建代表UI中的View的控件之前和之后执行自定义操作。

验证

阶段说明

干预方式

要开始认证过程,将创建一个对象空间(请参阅BaseObjectSpace),以检查应用程序数据库中是否存在定义登录用户的记录。在访问数据库之前,请检查数据库中模块版本及其实际版本的兼容性。如果数据库中的版本大于实际版本,则会引发异常,要求您增加应用程序的版本。如果较低,则引发XafApplication.DatabaseVersionMismatch事件。默认情况下,此事件在XAF解决方案中处理。事件处理程序调用数据库更新程序的更新方法,将数据库更新为所需版本。但是,当应用程序在调试模式下运行时,将调用此方法。在发布模式下,会引发异常(您可以在应用程序中看到整个代码)。

在开始身份验证过程之前,可以访问由登录用户修改的Log inParameters对象。为此,请处理XafApplication.LoggingOn事件。

您可以执行检查数据库和应用程序兼容性的自定义过程。为此,请处理XafApplication.CustomCheckCompatibility事件。在这种情况下,您还应该在此代码中引发XafApplication.DatabaseVersionMismatch事件,以便在需要时更新数据库。

如果不需要在应用程序中自动生成的XafApplication.DatabaseVersionMismatch事件处理程序中实现此方案,请编写一个自定义事件处理程序。例如,您可以实现一个自定义DatabaseUpdater类,并在DatabaseVersionMismatch事件处理程序中调用其Update方法。

使用XafApplication.DatabaseUpdateMode属性设置更新数据库机制所需的行为。例如,您可以设置UpdateDatabaseAlways值,以便在每次运行应用程序时更新数据库的版本。这在使用VB编写的应用程序中很有用,因为在VB项目中难以增加版本。

最终用户在登录窗口中单击“登录”后,便完成了身份验证。使用AuthenticationStandard策略时,将对登录窗口中键入其名称和密码与数据库中相应记录一致的用户进行身份验证。

如果内置身份验证类执行的默认身份验证不满足您的要求,请实施自定义类。例如,从内置身份验证类之一继承:AuthenticationStandardAuthenticationActiveDirectory。或者,从基AuthenticationBase类继承。在您的类中,重写Authenticate方法。它返回数据库中找到的用户对象,该对象具有登录的最终用户指定的凭据。若要使用自定义身份验证而不是默认身份验证,请将类的实例分配给Application.Security.Authentication属性。要查看示例,请参阅如何:使用“自定义登录参数和身份验证”主题。

您可以在将LogonParameters对象的属性值保存到商店之前对其进行访问。为此,请处理XafApplication.LastLogonParametersWriting事件。或者,您可以重写XafApplication.WriteLastLogonParametersCore方法,以实现用于保存凭据的自定义技术。

该系统为最终用户提供了三种登录该应用程序的尝试。第三次尝试后,登录窗口的视图将更改为新创建的LoginAttemptsAmountToLimit DetailView。这要求最终用户重新运行该应用程序以尝试再次登录。

若要更改默认的三尝试方案,请重写WebApplication类的后代中的OnLogonFailed方法。

您可以自定义LoginAttemptsAmountToLimit详细信息视图。为此,请使用“视图” | “视图”。模型编辑器中的LogonAttemptsAmountToLimit_DetailView节点。例如,您可以更改“查看项”的布局或执行本地化。

最终用户定制层已创建。在XAF ASP.NET Web应用程序中,由于默认情况下用户自定义项不存储在任何地方,因此不使用此层。

您可以通过设置存储在Web浏览器中的cookie到列表视图所作的修改IModelOptionsStateStore.SaveListViewStateInCookies的财产选项节点和IModelListViewStateStore.SaveStateInCookies相应的财产| <ListView>节点为true。

要在登录过程完成后访问LogonParameters对象或执行自定义操作,请处理XafApplication.LoggedOn事件。

转载保留此链接,注明出处