文本版|topic 高级搜索
   名人堂 帮助 论坛制度 意见反馈 | 首页 博客 周新贴 专题 求职 读书
RSS 底部
 
社区导航: 专家门诊   网络技术   操作系统   数据库   程序设计   系统应用   考试认证   CIO及信息化   站长交流   综合交流   下载基地  51CTO产品服务 设为首页 | 收藏本站
51CTO技术论坛» Web开发 » 基于令牌的分布式身份验证       [ 打印]  [ 订阅]  [ 收藏]  [ 推荐给朋友]   [ 本帖文本页]

论坛跳转:
     
标题: 基于令牌的分布式身份验证  ( 查看:1032  回复:2 )   
 
danni505
中级工程师  点击可查看详细


帖子 1505
精华 7
无忧币 8738
积分 6778
阅读权限 60
来自 (保密)
注册日期 2006-5-1
最后登录 2008-11-13 离线

[查看资料]  [发短消息]  [Blog
[个人主页]    QQ    ICQ 状态     
发表于:2006-8-16 14:08   标题:基于令牌的分布式身份验证
上一帖 |
思路:
web服务使用虽然方便,但安全是个问题,在企业开发中,经常面临多界面的客户端,使用你的服务的可能是个桌面程序也可能是个移动应用,这就要求集中的身份验证,而web服务来做这个事情是最合适不过的。我们先来用一个UserLoginInfo来保存登陆用户的令牌(token),主机地址(host)和安全上下文(IPrincipal),当然了真实环境中这些东西肯定应该是保存在数据库中的,然后写个sql job来定时清理过时的令牌。我们首先要写个身份验证的web服务(AuthenticateService.asmx),此服务用来进行身份验证,令牌检测,用户注销,获取安全上下文等功能。然后我们要开发一个业务服务的基类(ServiceBase.cs),因为调用每个业务服务的时候要保证这个调用是授权的,所以有好多共性的东西,所以我们提取一个基类出来,它主要有验证令牌,角色检验,注销等方法。因为web服务是无状态的,所以我们要用SOAP头来传递令牌,这样我们要定义一个tokenHeader的SOAP头,并把它声明在每个需要身份验证的web方法前。这样你就可以开发你的安全的业务服务了。
流程是这样的,你要使用一个业务服务,首先从身份验证服务那里进行身份验证,这时候会身份验证服务返回一个令牌,并把这个令牌和你的主机IP保存在UserLoginInfo的字典类里,你获取到这个这个令牌后把它缓存起来,然后在调用业务服务的时候把令牌赋值给SOAP头,它会自动传递。业务服务收到你的调用后,首先会调用基类的身份验证方法看看这个令牌是否合法(UserLoginInfo类里是否保存有这个令牌),然后检查你的IP是否和此令牌匹配,如果完全检查通过再让你使用实际的业务服务,否则会抛出Web异常,然后包装成SOAP异常,你客户端获取SOAP异常后再进行解析成友好的错误提示。
下载地址:http://www.cnblogs.com/Files/onlytiancai/EnterpriseDev.rar

简介:
思路介绍完了,简单介绍一下如何实现的,下面是一个业务服务方法
    EntitySerializer es = new EntitySerializer(EntitySerializeType.Xml);
    [WebMethod]
    [SoapHeaderAttribute("Token",
         Direction = SoapHeaderDirection.In)]
    public string GetAllOrders()
    {
        Authenticate();
        return es.SerializeArray(service.GetAllOrders());
    }
可以看到调用它需要传送一个SOAP头,这个SOAP头会填充私有变量Token(简单起见,令牌用GUID格式),然后调用基类的Authenticate()方法进行身份检查,检查通过后调用实际的业务逻辑。
注意:
1、NBear的持久层返回的实体都是接口,接口是不可以直接序列化的,所以不能通过WEB服务传递,这样就需要使用NBear的使用函数来把返回接口序列化成字符串再传递,然后客户端也用此类来解序列化。
2、web服务的令牌用SOAP可以简单的传递,如果是Remoting的话用System.Runtime.Remoting.Messaging.CallContext.SetData()和GetData()让令牌自动在上下文中传递。
再看看客户端如何调用,我们用一个winform窗体TestWebService.cs(TestApp项目)来演示。
    //调用身份验证服务进行身份验证并缓存令牌
    loginToken = service.Authenticate(txtName.Text, txtPassword.Text);
    //实例化业务服务,创建SOAP头,并给SOAP头用缓存的令牌赋值
    usefulService = new TestApp.OrderOperator.OrderService();
    usefulService.TokenHeaderValue = new TestApp.OrderOperator.TokenHeader();
    usefulService.TokenHeaderValue.InnerToken = loginToken;
   
    //使用业务服务获取数据并解序列化成接口实体数组,最后绑定到控件上
    orders = es.DeserializeArray(usefulService.GetAllOrders());
    listOrders.DisplayMember = "OrderID";
    listOrders.DataSource = orders;
注释写的很清楚了,不多说了,更详细的演示看下载的代码。
这次更新的代码又添加了以下几项技术。
1、winform2.0的TableLayoutPanel控件的使用
2、SOAP头的使用
3、SOAP异常的包装
4、NBear的序列化和解序列化
声明:演示代码中的Soap异常的包装和反包装是用的zongsoft的
下一步演示是Wap站点和Web门户,然后再演示remoting的性能计数、跟踪、授权等技术。

[ 本帖最后由 danni505 于 2006-8-16 14:09 编辑 ]



『 天道酬勤 』      君子之行,静以修身,俭以养德。非淡泊无以明志,非宁静无以致远。

2006-8-16 14:081楼
[ 顶部 ]
 
haiya
新新人类  点击可查看详细



帖子 36
精华 0
无忧币 -2
积分 46
阅读权限 20
注册日期 2006-9-21
最后登录 2006-12-20 离线

[查看资料]  [发短消息]  [Blog
       
发表于:2006-9-21 15:12 
ddddddddddddd
2006-9-21 15:122楼
[ 顶部 ]
 
Harries.Li
新新人类  点击可查看详细



诚信兄弟  
帖子 54
精华 0
无忧币 56
积分 55
阅读权限 20
来自 (保密)
注册日期 2006-4-8
最后登录 2007-9-18 离线

[查看资料]  [发短消息]  [Blog
[个人主页]         
发表于:2006-10-23 19:56 
比较难懂,看不懂!
2006-10-23 19:563楼
[ 顶部 ]
     
论坛跳转:  

| | |

| | |

| | |

标记已读 · 删除论坛Cookies · 文本版 · WAP
 
| 诚征版主 | 版主堂 | 意见建议 | 大史记 | 论坛地图
Copyright©2005-2008 51CTO.COM  Powered by Discuz!
本论坛言论纯属发布者个人意见,不代表51CTO网站立场!如有疑义,请与管理员联系。
京ICP备05051492号