Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ASP.NET的登录模型_Asp.net_Login_Design Patterns - Fatal编程技术网

ASP.NET的登录模型

ASP.NET的登录模型,asp.net,login,design-patterns,Asp.net,Login,Design Patterns,你能帮我解决我的问题吗 我有一个ASP.NET网站,它有一些基本的授权功能(登录/注销e.t.c.)。目前我有3种主要方法: bool登录(字符串名称、字符串密码) bool IsLogged() 字符串GetUserID() 所有这些方法都“硬编码”到一个类中。登录方法检查数据库以确定用户是否存在。但后来我决定使用XML文件来存储用户,这意味着检查用户的所有逻辑都应该重写 我想使用以下“模式”: 创建接口(例如ILoginProvider),声明上述3种方法 在任何类中实现此接口,并在Lo

你能帮我解决我的问题吗

我有一个ASP.NET网站,它有一些基本的授权功能(登录/注销e.t.c.)。目前我有3种主要方法:

  • bool登录(字符串名称、字符串密码)
  • bool IsLogged()
  • 字符串GetUserID()
所有这些方法都“硬编码”到一个类中。登录方法检查数据库以确定用户是否存在。但后来我决定使用XML文件来存储用户,这意味着检查用户的所有逻辑都应该重写

我想使用以下“模式”:

  • 创建接口(例如ILoginProvider),声明上述3种方法
  • 在任何类中实现此接口,并在Login()方法中编写特定逻辑来检查XML文件或数据库
  • 把这门课传给???(这是我的问题)
  • 我想创建一个类(例如LoginHelper),可以将ILoginProvider接口作为参数:

    class LoginHelper {
    
        private static ILoginProvider provider;
    
        // this method should be called somewhere in Application_Startup event in Global.asax
        public static void RegisterLoginProvider(ILoginProvider inst) {
            provider = inst; 
        }
    }
    
    然后写下必要的方法:

    public static bool IsLogged() {
        return provider.IsLogged();
    }
    
    然后在应用程序启动事件中调用Global.asax中的RegisterLoginProvider()方法:

    MyCustomProvider prov = new MyCustomProvider(); // this class implements ILoginProvider interface
    LoginHelper.RegisterSecurityProvider(prov);
    

    使用其他“提供者”更改某些“提供者”是否是实现此类逻辑的正确方法?

    通常通过服务定位器(Unity、StructureMap等)或自定义工厂执行此操作,您在其中请求ILoginProvider的实例并返回正确的实例

    选择要创建哪种ILoginProvider的责任并不取决于调用类

    //get a login provider from via a service locator
    ILoginProvider provider = DependencyLookup.Resolve<ILoginProvider>();
    
    //通过服务定位器从获取登录提供程序
    ILoginProvider provider=DependencyLookup.Resolve();
    
    使用服务定位器,您可以在XML配置或代码中针对ILoginProvider注册要使用的实现。这里有一个团结的例子

    public static class ContainerConfiguration
    {
        public static void Configure()
        {
            ServiceLocator.Current.RegisterType<ILoginProvider, XmlLoginProvider>();
        }
    }
    
    公共静态类容器配置
    {
    公共静态void Configure()
    {
    ServiceLocator.Current.RegisterType();
    }
    }
    
    您试图抽象出登录功能,这非常好。此外,还必须通过DependencyInjection将此帮助程序绑定到页面,即必须向类中添加一个以LoginInterface为参数的构造函数。然后,您可以使用StructureMap等实用工具在运行时获取实例


    通过使用这些接口,我们可以为将来的情况提供适应性,在这些情况下,您可以移动到DB或webservice。

    通常,您可以使用基于提供程序的配置模型在web.config中定义提供程序,并选择默认的提供程序。这就是SiteMapProviders、MemberShipProviders、RoleProviders等的实现方式,以及遵循defactor标准的良好实践。遵循标准是良好实践,但不是必要的,此外,哪种实现方式超出了这个问题的范围。但是如何找出我应该使用哪种ILoginProvider呢?也许我应该在web.config中保存一个类名,然后以如下方式将其传递给我的LoginHelper类:LoginHelper.RegisterLoginProvider(Activator.CreateInstance(“my_class_name_From_web.config))?IoC和依赖项查找对我来说很难理解…如果您使用其中一个服务定位器,所有的艰苦工作都会为您完成。好的,它会变得更清楚。但是什么是ServiceLocator?它是Unity或MS Enterprise Library的一个类还是一个简单的示例?ThanksI指的是Unity、结构图、Castle Windsor等的使用。