如何在OWIN应用程序

时间:2017-10-26 23:04:58

标签: .net authentication cookies owin ws-federation

我正在制作一个OWIN应用程序来自我托管网站。我在验证部分遇到问题。我正在寻找的基本流程是:

  1. 检查请求是否包含正确的cookie。如果它具有正确的Cookie,请获取SecuritySessionToken并构建ClaimsIdentity,然后返回AuthenticationTicket
  2. 如果cookie不在那里,那就让STS知道。
  3. 从STS获取SAML令牌并构建声明&身份验证票。 (即使我使用的是WsFederation身份验证,此处也不涉及ADFS。)
  4. 第一步对我来说很好。第2步和第3步是我遇到麻烦的地方。

    这就是我在启动类中的配置方法:

    public void Configuration(IAppBuilder app)
    {
        CookieAuthenticationOptions options = new CookieAuthenticationOptions
        {
            AuthenticationType = WsFederationAuthenticationDefaults.AuthenticationType,
            CookieName = "MyCookieName",
            CookiePath = "/cookiePath",
            AuthenticationMode = AuthenticationMode.Active
        };
        // Not relevant how this module is made. It helps with
        SessionAuthenticationModule module = this.CreateModule();
        app.Use(typeof(MyCookieAuthenticationMiddleware), app, options, module);
    
        WsFederationConfiguration fedConfig = new WsFederationConfiguration();
        fedConfig.Issuer = "https://mySTS.com/NotRealUrl/";
        SecurityTokenHandlerCollection handlerCollection = new SecurityTokenHandlerCollection(new List<SecurityTokenHandler>() { new SamlSecurityTokenHandler() });
        WsFederationAuthenticationOptions wsFederationOptions = new WsFederationAuthenticationOptions
        {
            Configuration = fedConfig,
            Wtrealm = "http://localhost/MyApp/NotRealUrl",
            Wreply = "https://mySTS.com/NotRealUrl/Login",
            SecurityTokenHandlers = handlerCollection,
            AuthenticationMode = AuthenticationMode.Active,
            AuthenticationType = WsFederationAuthenticationDefaults.AuthenticationType
        };
        app.Use(typeof(MyWsFederationAuthenticationMiddleware), app, wsFederationOptions);
        app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
        app.Use<MyMiddleware>();
    }
    

    app.Use(typeof(MyCookieAuthenticationMiddleware), app, options, module); 之前的部分可以正常使用。也就是说,当cookie存在时,我使用自定义cookie身份验证中间件(MyCookieAuthenticationMiddleware)来生成AuthenticationTicket

    无法正常工作的部分是WsFederation身份验证中间件部分。我为此创建了自己的中间件(MyWsFederationAuthenticationMiddleware),这样我就可以看一下自app.UseWsFederationAuthentication(wsFederationOptions)直接不能为我工作的事情。我正在查看WsFederationAuthenticationHandler.cs的源代码来指导我,但我仍然对一些整体概念感到困惑。

    问题

    1. 我想我知道一般流程应该是什么(我编号的是什么 顶部),但我不确定这是如何完全转换为 中间件管道。如果我没有饼干,那么我就会发现它 位于AuthenticateCoreAsync()的{​​{1}}。但 我在什么时候将其重定向到STS以获取SAML令牌? 我是否只是等待管道点击MyCookieAuthenticationHandler AuthenticateCoreAsync(),如果用户不是, 经过身份验证,然后获取令牌?
    2. 我如何告诉管道获取令牌所需的内容 来自STS?再看一下 WsFederationAuthenticationHandler.cs,似乎是他们的 MyWsFederationAuthenticationHandler的实施可能正在做 我想要的是?更具体地说,如果它是401状态代码,那么make 一个ApplyResponseChallengeAsync()并使用该消息重定向到STS?
    3. 假设我实际上可以让STS返回我想要的令牌, 在管道中它返回哪里?
    4. 感谢并为这篇长篇文章感到抱歉。

      更新1

      我忘了提及,当我使用WsFederationMessage(而不是我自己的app.UseWsFederationAuthentication(wsFederationOptions))运行我的代码时,我收到了400&#34;错误的请求 - 请求太长&#34;错误。 URL非常长,看起来像包含各种查询参数,包括wtrealm,wctx,wa和wreply,每个参数都包含url编码的字符串。看起来wctx真的很长。我想它是一些base64编码对象。不幸的是,我真的不知道发生了什么。

1 个答案:

答案 0 :(得分:1)

我认为,问题是两个中间件都有AuthenticationMode Active

您应该将CookieAuthenticationOptions.AuthenticationType更改为CookieAuthenticationDefaults.AuthenticationType,然后将WsFederationAuthenticationOptions.AuthenticationMode设置为被动。

我推荐一个自定义控制器。如果用户访问此控制器,您必须手动触发OwinContext.Authentication WsFederationAuthenticationDefaults.AuthenticationType上的ApplyResponseChallengeAsync身份验证并返回401.这应触发WsFederationAuthenticationHandler SecurityTokenValidated >

WsFederationAuthenticationOptions.Notifications上的CookieAuthenticationDefaults.AuthenticationType方法中,您可以发布一个身份类型为 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + 0, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, texData(0)); glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + 1, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, texData(1)); glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + 2, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, texData(2)); glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + 3, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, texData(3)); glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + 4, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, texData(4)); glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + 5, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, texData(5)); 的新AuthTicket。

现在,来自身份提供者的身份将转换为带有cookieauth的本地身份。