设置STS但在webapp中保留formsauthentication

我正在现有的webapp上启用Windows身份基础。

我希望尽可能少地使用现有代码,因此我想使用在应用程序中使用的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/") } } 

是否有人知道这是否可以做到以及如何做? 任何链接到示例代码(如果可用)深受赞赏。

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

我知道这可能看起来像一个糟糕的设计,而不是一直用STS,但我需要尽快实现这一点,我希望保持原始网站尽可能不受影响。

这不是一个糟糕的设计,这是你的要求,你试图实现它。 我们有这样的工作系统,它不是火箭科学。 唯一的区别是我们静态地(通过全局设置)将其切换为窗体/ sam,而不是动态地。

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

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

如果用户遵循表单身份validation,则会设置cookie并完成操作。 如果用户遵循STS登录控制,他/她迟早会带回有效的SAML令牌。 FederatedPassiveSignIn将自动获取它,您只需处理SignedIn事件中的重定向。

if你在问题中提到,你甚至不需要。

我记得有一点需要注意。 当用户通过STS进行身份validation时,会创建WS-Federation cookie,您可以读取声明等。一切正常。

但是,如果用户通过表单进行身份validation,则SAM(SessionAuthenticationModule)将在EACH请求时通过ASP.NET管道中的WS-Federation cookie来替换表单cookie(我猜是因为SAM稍后在构成身份validation模块的管道中) 。

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

但是,如果您在代码中的任何位置尝试直接从表单cookie中提取信息(而不是使用常规API),您可能会发现表单cookie不存在,即使用户首先通过表单进行身份validation(并且cookie不存在,因为它将被WS-Federation cookie替换)。