惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Recent Announcements
Recent Announcements
J
Java Code Geeks
U
Unit 42
GbyAI
GbyAI
大猫的无限游戏
大猫的无限游戏
L
LangChain Blog
D
Docker
F
Fortinet All Blogs
N
Netflix TechBlog - Medium
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
罗磊的独立博客
I
InfoQ
The Cloudflare Blog
小众软件
小众软件
V
Visual Studio Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Engineering at Meta
Engineering at Meta
S
SegmentFault 最新的问题
爱范儿
爱范儿
Hugging Face - Blog
Hugging Face - Blog
P
Proofpoint News Feed
V
V2EX
月光博客
月光博客
Martin Fowler
Martin Fowler

博客园 - 镜涛

Spark环境搭建遇到的问题 This installation has not been configured properly for Software Updates The Activator X for bundle Y is invalid, caused by ClassNotFoundException: X SAP全球技术大会参会随笔 工作流系统概述 需要掌握的flex知识点 ORA-01460: 转换请求无法实现或不合理 去除对象中的类型集合 【转载】Tomcat内存溢出的原因及调试 做产品开发的感想 Cursor identified in Fetch statement is not open Java下载中文乱码问题解决方法 - 镜涛 - 博客园 获取矩形中心点与矩形外某点连线和矩形交点的算法 Could not find the main class. Program will exit. - 镜涛 Unrecognized attribute 'targetFramework'.错误解决 [译]Razor内幕之模板 - 镜涛 - 博客园 [译]Razor内幕之表达式 - 镜涛 - 博客园 [译]Razor内幕之解析 [译]Razor内幕之介绍
基于SAML的单点登录.NET代理端实现方案
镜涛 · 2011-03-18 · via 博客园 - 镜涛

SAML的相关内容就不介绍了,想深究的可以研究下相关的规范,主要写下大体的思路。

通过SAML实现单点登录的运转过程如图:

 

此处的ServiceProvider是服务提供者,也就是用户需要访问的应用,IdentityProvider是认证提供者。

通过上图可以看出,当用户访问一个应用的时候,如果用户没有登陆,那么需要将用户重定向到认证服务,认证服务判断该用户是否已经经过认证,如果没有认证过那么进行认证,然后生成断言响应发送给SPSP负责处理断言,验证用户是否认证通过。也就是说SP进行了请求转发和断言解析两个过程。在.NET中我们可以通过HttpModule来过滤请求,对没有认证的请求进行转发,通过HttpHandler过滤断言请求,对断言进行处理。

这种方案的好处是,不需要修改既有的应用程序代码,就能够将其集成到单点登录系统中。也就是只要把认证的Dll复制到应用执行目录下,然后配置HttpModuleHttpHandler即可。

示例ModuleHandler如下

    /// <summary>

    /// HTTP Module 处理所有Http请求

    /// </summary>

    public class SPDispatcherFilter : IHttpModule

    {

        public void Init(HttpApplication context)

        {

           context.AcquireRequestState += new EventHandler(context_AcquireRequestState);

        }

        /// <summary>

        /// 在session创建完成后处理请求

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        void context_AcquireRequestState(object sender, EventArgs e)

        {

            HttpApplication app = sender as HttpApplication;

            //如果还没加载过配置信息,那么进行加载

            if (!ConfigInfo.HasLoadMetaData)

                MetaData.Load(app.Request.PhysicalApplicationPath + ConfigurationManager.AppSettings["MetaDataPath"]);

//处理http请求

            if (HTTPUtils.HandleRequest(app.Context))

                app.CompleteRequest();

        }

}

    /// <summary>

    /// Http Handler 处理SAML请求

    /// </summary>

    public class SPDispatcherHandler:IHttpHandler,IRequiresSessionState

    {

        public bool IsReusable

        {

            get { return true; }

        }

        public void ProcessRequest(HttpContext context)

        {

            HTTPUtils.HandleRequest(context);

        }

    }

配置方式如下:

1. 在IIS应用程序中增加模块(Module),如图:

 

名称随便,类型为:处理类的完整名称(命名空间+类名

2. 在IIS应用程序中增加HttpHandler,如图:

 

请求路径为:*/SAML/*

类型为:处理类的完整名称(命名空间+类名