EPR类企业管理系统

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


定制
QQ:460-3528

开发
QQ群:3360-90194

源码
微信:136-3650-3721

使用Windows Forms应用程序中的登录窗口进行用户身份验证

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

创建登录视图

阶段说明

干预方式

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

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

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

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

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

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

创建登录窗口

MainWindowWin1

阶段说明

干预方式

在创建Window类的实例之前,将创建必需的Controller。

如果您需要自定义按钮添加到登录窗口,或自定义默认的行为,实现自定义对话框控制器从继承LogonController对话控制器。请注意,可视化登录窗口的默认模板仅包含ButtonsContainer 操作容器。因此,您可以添加到Controller的操作类型受到限制(请参阅将操作添加到弹出窗口)。若要替换默认的LogonController,请在WinApplication后代中重写CreateLogonController方法。

默认情况下,仅创建足以用于登录窗口的控制器。您可以创建额外的控制器。为此,请在WinApplication类中处理XafApplication.CreateCustomLogonWindowControllers事件。返回已创建控制器的列表。

订阅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事件。这是使用Controller执行所需功能的主要条目。

将模板分配给窗口

LogonWindowWin2

阶段说明

干预方式

为了可视化,“登录”窗口创建一个Template,它是支持XAF架构的控件(例如,表单)。要创建模板,请使用框架模板工厂。它创建适合Window上下文的Template(请参见Frame.Context)。登录窗口是在“ PopupWindow”上下文中创建的。默认情况下,用于创建模板的DefaultFrameTemplateFactory在“ PopupWindow”上下文中创建内置的PopupForm模板。

订阅WinApplication对象的XafApplication.CreateCustomTemplate事件,以在“ PopupWindow”上下文中创建自定义模板。若要获取在其中创建模板的当前上下文,请使用事件处理程序的Context参数。若要查看示例,请参考模板自定义如何:创建自定义WinForms功能区模板主题。

使用自定义框架模板工厂创建自定义模板。在实现自定义模板的模块中注册所需的框架模板工厂。在这种情况下,应将模块添加到应用程序以使用自定义模板。有关详细信息,请参阅“如何:使用模块分发自定义模板”主题。

创建模板时,还将创建其所有动作容器。操作容器是显示“操作”的控件。该PopupForm类模板包含PopupActions按钮动作集装箱。该容器通过按钮表示动作。有关详细信息,请参阅“将操作添加到弹出窗口”主题。

订阅WinApplication对象的XafApplication.CustomizeTemplate事件。若要自定义为“登录窗口”创建的模板,请使用事件处理程序的Context参数。必须将其设置为TemplateContext.PopupWindow。要查看示例,请参阅模板自定义主题。

创建的模板将分配给Window.Template属性。

创建动作控件

LogonWindowWin3

阶段说明 干预方式
Window的TemplateChanged事件引发。此事件由已激活的FillActionContainersController处理,因为它表示窗口控制器。该TemplateChanged事件处理程序寄存器操作在窗口的模板的行动容器。每个Action是注册在其所在的应用模型的映射操作集装箱ActionDesign | ActionToContainerMapping节点。动作容器为其动作创建控件。 订阅Frame.TemplateChanged事件以访问登录窗口的模板及其操作容器。为此,请使用窗口控制器的Controller.Activated事件。要查看示例,请参考如何:访问导航控件主题。

将视图分配给窗口

LogonWindowWin5

阶段说明 干预方式
创建的视图将分配给登录窗口。 订阅Frame.ViewChangingFrame.ViewChanged事件。您可以在Widow Controller的Controller.Activated事件处理程序中或View Controller的Controller.FrameAssigned事件处理程序中执行此操作。

视图控制器已激活

LogonWindowWin6

阶段说明

干预方式

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

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

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

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

将窗口的视图分配给模板

LogonWindowWin7

阶段说明

干预方式

视图被分配给当前窗口的模板。这将强制创建View的控件(请参见View.CreateControls)。将该控件添加到模板的ViewSite中。

处理View.ControlsCreatingView.ControlsCreated事件,以在创建表示UI中的View的控件之前和之后执行自定义操作。

调用模板的ISupportStoreSettings.SetSettings方法以应用最终用户上次运行应用程序时指定的设置。

默认情况下,模板的设置将保存到“应用程序模型”的“模板” | “模板”中。模板节点。您可以将它们保存到另一个“应用程序模型”节点。为此,请在WinApplication类中重写GetTemplateCustomizationModel方法,并在其中返回所需的节点。

您可以将模板的设置保存在其他存储中。为此,实现一个自定义模板,以覆盖IFrameTemplate接口公开的方法。

显示模板。

验证

阶段说明

干预方式

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

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

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

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

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

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

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

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

要创建自定义用户模型差异存储,请处理XafApplication.CreateCustomUserModelDifferenceStore事件。默认的Store从Model.User.xafml文件中保存和加载用户差异。若要了解如何实现自定义存储,请参考如何:在数据库文档中存储应用程序模型差异。

系统为最终用户提供了三种尝试登录到该应用程序的尝试。第三次尝试后,将引发用户友好的异常。

若要更改三种尝试方案,请重写WinApplication类的后代中的Logon方法。

创建具有最终用户自定义的应用程序模型层,并将其存储在Model.User.xafml文件中。该文件将最终用户自定义存储到应用程序,该自定义是在上一个应用程序运行期间创建的。

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

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