FluorineFx.NET的认证(Authentication )与授权(Authorization)Flex与.NET互操作 九

应用程序可根据用户信息授予和拒绝执行。FluorineFx.NET的认证和授权使用.Net Framework基于角色的安全性的支持。

比如说我们需要自定义一个认证与授权的方案,指定那些远程服务上的那些方法将要被认证或授权以及授权用户角色组等,我们就需要自定义一个 LoginCommand并实现ILoginCommand接口或者继承于 FluorineFx.Security.GenericLoginCommand(此类实现了ILoginCommand接口)基类。接口定义如下:

1 namespace FluorineFx.Security
 2 {
 3     public interface ILoginCommand
 4     {
 5         IPrincipal DoAuthentication(string username, Hashtable credentials);
 6         bool DoAuthorization(IPrincipal principal, IList roles);
 7         bool Logout(IPrincipal principal);
 8         void Start();
 9         void Stop();
10     }
11 }

网关通过调用该接口中的方法DoAuthentication()来实现验证,具体的验证规则我们可以自定义(重写方法的实现)。

1 /// <summary>
 2 /// 自定义 LoginCommand
 3 /// </summary>
 4 public class LoginCommand : GenericLoginCommand
 5 {
 6     public override IPrincipal DoAuthentication(string username, Hashtable credentials)
 7     {
 8         string password = credentials["password"] as string;
 9         if (username == "admin" && password == "123456")
10         {
11             //用户标识
12             GenericIdentity identity = new GenericIdentity(username);
13             //角色数组
14             GenericPrincipal principal = new GenericPrincipal(identity, new string[] { "admin", "privilegeduser" });
15             return principal;
16         }
17         else
18         {
19             return null;
20         }
21     }
22 }

如上面代码块,检测用户是不是属于"admin"和"privilegeduser"两个角色组之一,否则则不能通过验证。要实现授权则是通过DoAuthorization()方法来实现,我们同样可以重写实现以满足自己的需求。

除此之外还需要service-config.xml,指定通过那一个LoginCommand来执行认证与授权,以及要被授权的方法和角色组,login-command的class指向自定义的LoginCommand.

<security>
      <security-constraint id="privileged-users">
           <auth-method>Login</auth-method>
           <roles>
                  <role>admin</role>
                  <role>privilegeduser</role>
          </roles>
    </security-constraint>

<login-command class="FlexDotNet.ServiceLibrary.Authentication.LoginCommand" server="asp.net"/>
</security>

要使Flex能够调用认证与授权,同样需要提供一个远程服务接口,并为该接口添加RemotingServiceAttribute描述:

1 namespace FlexDotNet.ServiceLibrary.Authentication
 2 {
 3     /// <summary>
 4     /// 远程服务LoginService
 5     /// </summary>
 6     [RemotingService]
 7     public class LoginService
 8     {
 9         public LoginService()
10         { }
11 
12         /// <summary>
13         /// 登录
14         /// </summary>
15         /// <returns></returns>
16         public bool Login(string userName,string password)
17         {
18             if (userName == "admin" && password == "123456")
19             {
20                 //do other
21                 return true;
22             }
23             else
24             {
25                 //do other
26                 return false;
27             }
28         }
29 
30         /// <summary>
31         /// 注销
32         /// </summary>
33         /// <param name="userName">用户名</param>
34         /// <returns></returns>
35         public bool Logout(string userName)
36         {
37             GenericIdentity identity = new GenericIdentity(userName);
38             GenericPrincipal principal = new GenericPrincipal(identity, new string[] { "admin", "privilegeduser" });
39 
40             if (new LoginCommand().Logout(principal))
41                 return true;
42             return false;
43         }
44     }
45 }

在Flex或Flash端就可以通过RemoteObject来访问远程对象,Flex的访问配置如下代码块:

<mx:RemoteObject id="loginService" destination="login">
    <mx:method name="Login" result="onLoginResult(event)" fault="onLoginFault(event)"/>
</mx:RemoteObject>

通过配置RemoteObject指定访问login这个配置的远程服务,服务里配置了一远程方法Login,并分别定义了访问成功和失败的处理函数。上面的RemoteObject访问的目的地为login配置的目的地,详细配置在remoting-config.xml里,如下:

<destination id="login">
      <properties>

<source>FlexDotNet.ServiceLibrary.Authentication.LoginService</source>
      </properties>
</destination>

FlexDotNet.ServiceLibrary.Authentication.LoginService为自定义的一个远程服务(标记为RemotingService)接口,通过配置访问目的地,Flex远程对象组件利用此目的地通过FluorineFx网关调用远程服务接口方法。

布局Flex界面,模拟登录验证的调用,Flex通过setCredentials()方法请求,详细如下代码块:

private function Login():void
{
    loginService.logout();
    loginService.setCredentials(txtName.text,txtPassword.text);
    loginService.Login();
}

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
    <mx:Script>
        <![CDATA[
            import mx.utils.ObjectUtil;
            import mx.controls.Alert;
            import mx.rpc.events.FaultEvent;
            import mx.rpc.events.ResultEvent;
            private function Login():void
            {
                loginService.logout();
                loginService.setCredentials(txtName.text,txtPassword.text);
                loginService.Login();
            }
            
            private function Logout():void
            {
                loginService.logout();
            }
            
            private function onLoginResult(evt:ResultEvent):void
            {
                var result:Boolean = evt.result as Boolean;
                if(result)
                    Alert.show("登录验证成功");
            }
            
            private function onLoginFault(evt:FaultEvent):void
            {
                Alert.show(ObjectUtil.toString(evt.fault),"登录验证失败");
            }
        ]]>
    </mx:Script>
    
    <mx:RemoteObject id="loginService" destination="login">
        <mx:method name="Login" result="onLoginResult(event)" fault="onLoginFault(event)"/>
    </mx:RemoteObject>
    <mx:Panel x="124" y="102" width="250" height="200" layout="absolute" fontSize="12" title="用户登录">
        <mx:Label x="19" y="28" text="用户名:"/>
        <mx:Label x="19" y="72" text="密   码:"/>
        <mx:TextInput x="75" y="26" width="131" id="txtName"/>
        <mx:TextInput x="75" y="69" width="131" id="txtPassword" displayAsPassword="true"/>
        <mx:HBox x="75" y="107" width="131" height="30">
            <mx:Button label="登 录" click="Login()"/>
            <mx:Button label="清 空"/>
        </mx:HBox>
    </mx:Panel>
</mx:Application>

(0)

相关推荐

  • FluorineFx.NET的认证(Authentication )与授权(Authorization)Flex与.NET互操作 九

    应用程序可根据用户信息授予和拒绝执行.FluorineFx.NET的认证和授权使用.Net Framework基于角色的安全性的支持. 比如说我们需要自定义一个认证与授权的方案,指定那些远程服务上的那些方法将要被认证或授权以及授权用户角色组等,我们就需要自定义一个 LoginCommand并实现ILoginCommand接口或者继承于 FluorineFx.Security.GenericLoginCommand(此类实现了ILoginCommand接口)基类.接口定义如下: 1 namespa

  • springmvc+shiro+maven 实现登录认证与权限授权管理

    Shiro 是Shiro 是一个 Apache 下的一开源项目项目,旨在简化身份验证和授权. 1:shiro的配置,通过maven加入shiro相关jar包 <!-- shiro --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.2.1</version> <

  • Flex与.NET互操作(十二):FluorineFx.Net的及时通信应用(Remote Shared Objects)(三)

    FluorineFx所提供的远程共享对象(Remote Shared Objects)和FMS的共享对象的功能是一样,对于熟悉FMS开发的朋友来说,学习FluorineFx的远程共享对象是非常简单的. 共享对象可以在服务器端创建,也可以在客户端创建.在客户端创建共享对象的方法和使用FMS开发是一样的,创建一个 NetConnection对象,通过该对象的connect()方法连接到服务器,然后通过SharedObject.getRemote()方法就可以在客户端创建一个远程共享对象.如下实例代码

  • Flex与.NET互操作(十三):FluorineFx.Net实现视频录制与视频回放

    通过它我们可以非常方便的实现在线视频录制.视频直播.视频聊天以及视频会议等类似应用程序的开发. 在<FMS3系列(四):在线视频录制.视频回放 >这篇文章里我写了通过FMS来实现在线视频录制和视频回放的功能,客户端的开发和这篇文章是相同的,不同的是本文将使用Flex来开发. 首先我们来看看使用FluorineFx服务端是如何开发的,建立ApplicationAdapter是必然的,这里我们为本文中的示例程序建立的ApplicationAdapter为VideoApplication,并为其添加

  • Flex和.NET协同开发利器FluorineFx Flex与.NET互操作

    通过这些方式来完成与服务端的通信是非常方便和简单的,但有他的缺点就是通信数据量较小,如要传输大量的数据或是实现不同对象的序列化传输,它们则满足不了我们的需求,需要寻找另外一种通信协议,另一种高效的传输协议来代替SOAP协议传输的方案,那便是AMF(ActionScript Message Format)协议. 开源项目FluorineFx就是专门针对.NET平台与Flex通信提供的AMF协议通信网关,我们可以通过FluorineFx很方便的完成与.NET的通信. FluorineFx官方提供了安

  • Flex与.NET互操作 了解FluorineFx的环境配置(远程对象、网关、通道、目的地)

    在本系列文章的前面几篇文章中所介绍的访问Webservice的方法,也就是一种远程对象方法,只不过他是基于WEB服务(WebServie)的远程访问,不是基于远程对象(Remoting Object)的的远程访问.要想直接实现基于对象的远程访问是比较麻烦的,然后FluorineFx则专门为我们提供了该功能,通过 FluorineFx的核心库来开发远程对象(Remoting Object)服务,具体是怎么实现的呢? FluorineFx要求为远程对象提供[RemotingService]标记来提供

  • Flex与.NET互操作(十一):FluorineFx.Net的及时通信应用(Remote Procedure Call)(二)

    NET的服务器端同样也可以非常方便的呼叫客户端,调用客户端的方法(比如实现系统广播). 一.客户端的RPC(客户端调用服务器端) 要想实现客户端访问服务器端的方法,首先得对ActionScript中的NetConnection比较熟悉,该类提供了一个示例方法call()专们用来做RPC访问,该方法的定义如下: public function call(command:String, responder:Responder,  arguments):void 比如说我们在开发一个及时应用的时候,所

  • Flex与.NET互操作(八) 使用FluorineFx网关实现远程访问

    于此,本文将使用FluorineFx网关来提供数据服务等多项功能来介绍通过FluorineFx实现远程访问的相关知识点. FluorineFx提供的远程访问包括有很多方面的知道点,本文只介绍其中的三个知识点:访问远程对象返回对象,返回DataTable,返回DataSet对象.FluorineFx安装包里自带有相关的示例程序,要学习更多可直接参考这些示例程序. 在实现访问前我们同样来做一些准备工作,建立好远程对象,如下: 1 namespace Fluorine.ServiceLibrary 2

  • Flex与.NET互操作(十):FluorineFx.Net的及时通信应用(ApplicationAdapter)(一)

    应用程序适配器对象也就相当于是一个Flash媒体服务器应用程序的对象. 使用FluorineFx.Net开发及时通信应用,我们可以通过ASP.NET网站来宿主,一个ASP.NET网站可以承载多个实时通讯应用程序.这些应用程序都存储ASP.NET网站的根目录下指定文件夹的根目录中.如下图示: 在开发FluorineFx的及时通信应用的时候,按照FluorineFx的目录结构配置ASP.NET的站点目录是非常简单的,只需要在ASP.NET站点下面建立一个名为apps的目录,那么FluorineFx就

  • springmvc集成shiro登录权限示例代码

    一般的登录流程会有:用户名不存在,密码错误,验证码错误等.. 在集成shiro后,应用程序的外部访问权限以及访问控制交给了shiro来管理. shiro提供了两个主要功能:认证(Authentication)和授权(Authorization);认证的作用是证明自身可以访问,一般是用户名加密码,授权的作用是谁可以访问哪些资源,通过开发者自己的用户角色权限系统来控制. shiro的会话管理和缓存管理不在本文范围内. 下面通过登录失败的处理流程来介绍springmvc与shiro的集成. 项目依赖:

随机推荐