c# - 设置STS但在webapp中保留formauthentication

标签 c# asp.net vb.net forms-authentication wif

我正在现有的网络应用程序上启用 Windows Identity Foundation。

我想尽可能少地扰乱现有代码,所以我想登录页面使用应用程序中留下的 formsauthentication,如果用户通过特定页面进入应用程序,我只连接 STS,例如“im_comming_from_some_other_site .aspx”。

在“im_comming_from_some_other_site.aspx”中,代码​​如下:

Page_Load(...)
{
   if(verifyAgainstSTS()
   {
        FormsAuthentication.SetAuthCookie(<some_STS_Userid), ...)
        Response.Redirect("default.aspx")
   }
   else
   {
        Response.Redirect("http://<STS_server_name/<STS_service...etc>")
   }
}

是否有人知道这是否可以完成以及如何完成?非常感谢任何指向示例代码的链接(如果可用)。

(当然需要一些代码来确定当认证超时时要做什么;要么转到本地登录页面,要么转到STS-登录页面)

我知道这似乎是一个糟糕的设计,不能完全使用 STS,但我需要尽快实现它,并且我希望尽可能保持原始站点不变。

最佳答案

这不是一个糟糕的设计,这是您的要求,您会努力实现它。我们有这样构建的工作系统,这不是火箭科学。唯一的区别是我们将它静态地(通过全局设置)而不是动态地切换到 forms/sam。

无论如何,您在 web.config 中保留表单例份验证,这样当当前用户没有授权时,表单会将请求重定向到登录页面。

在登录页面中,您有两个选项。以某种方式创建表单 cookie。 另一个选项涉及 WIF 的 FederatedPassiveSignIn 控件。

如果用户遵循表单例份验证,则设置 cookie,您就完成了。 如果用户遵循 STS 登录控制,他/她迟早会返回有效的 SAML token 。 FederatedPassiveSignIn 将自动获取它,您只需在 SignedIn 事件中处理重定向。

您甚至不需要您在问题中提到的 if

我记得有一个警告。当用户通过 STS 身份验证时,将创建 WS-Federation cookie,您可以读取声明等。一切正常。

但是,如果用户通过表单进行身份验证,则 SAM (SessionAuthenticationModule) 将根据每个请求在 ASP.NET 管道中用 WS-Federation cookie 替换表单 cookie(我猜这是因为 SAM 稍后位于表单的管道中认证模块)。

这不会破坏您的 context.User.Identity.IsInRole(...) 授权也能正常工作,因为 SAM 会将用户角色复制到相应的声明中。

但是,如果您在代码中的任何地方尝试直接从表单 cookie 中提取信息(而不是使用通用 API),您可能会发现表单 cookie 不存在,即使用户通过表单进行了身份验证第一名(cookie 不存在,因为它将被 WS-Federation cookie 取代)。

关于c# - 设置STS但在webapp中保留formauthentication,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9623136/

相关文章:

c# - 单体机器人 : Unhandled Exception Recovery

c# - 在接口(interface)上定义的 WebApi 属性路由

asp.net - 从 asp.net 初始化 React 组件

c# - 使用 InProc session 管理的并发 ASP.NET 请求

c# - 获取浏览器中打开的标签页的 URL

c# - 推特,Oauth,关注用户

c# - 如何在 WPF 和 ASP.NET MVC 应用程序之间共享最多的代码?

asp.net - 如何在 VS2010 中使用 Web 部署设置文件夹 ACL?

wpf - VSTO Excel 插件中的独立 WPF 表单无法保持焦点

xml - 从 xml 文件的 vb.net 十六进制扫描