Authentication 本地ADFS流的正确身份验证设置是什么?

Authentication 本地ADFS流的正确身份验证设置是什么?,authentication,iis,owin,adfs,Authentication,Iis,Owin,Adfs,我一直在阅读Vittorio Bertocci的博客,尝试在MVC应用程序或WebApi服务中使用ADF管理身份验证和声明。看起来它变得越来越平易近人了 我现在正在尝试使用ADF构建一个POC,以解决企业内部站点/服务的常见索赔问题。我们的用户将与我们的端点一起位于内部网络上。现在我们默认使用Windows Integrated auth,每个站点都会查找用户名、电子邮件和其他广告详细信息,并通过IsInRole检查角色的声明主体。我们通过integrated auth获得的声明只包括一个Sam

我一直在阅读Vittorio Bertocci的博客,尝试在MVC应用程序或WebApi服务中使用ADF管理身份验证和声明。看起来它变得越来越平易近人了

我现在正在尝试使用ADF构建一个POC,以解决企业内部站点/服务的常见索赔问题。我们的用户将与我们的端点一起位于内部网络上。现在我们默认使用Windows Integrated auth,每个站点都会查找用户名、电子邮件和其他广告详细信息,并通过IsInRole检查角色的声明主体。我们通过integrated auth获得的声明只包括一个SamIdentifier和一组SID。我希望ADF能为我们做到这一点,但仍能为我们的用户提供无挑战的体验。从长远来看,我们可能会在一些站点/服务上增加对非加入域的设备的支持,因此这是探索ADF的另一个动机

因此,我在VS2013中使用组织帐户(内部部署)设置了一个简单的示例应用程序,该应用程序将转储当前用户的声明,配置元数据端点和受众uri,将该信息与我希望映射到我的ADFS管理员(2012,btw)的声明一起传递,并将我的站点部署到开发服务器。所以我的主机仍然是IIS,尽管我希望使用Owin中间件来设置身份验证,而不是web.config(WIF样式)

鉴于IIS是我的主机,如何为我的站点配置身份验证:匿名?my web.config应该为身份验证模式指定“无”,为授权指定deny=“?”,对吗

Vittorio在关于本地ADF的帖子中没有提到的另一个问题是承载令牌的性质,以及我们是否需要显式配置中间件以使用cookie。我的启动配置现在如下所示:

    public void ConfigureAuth(IAppBuilder app)
    {
        app.UseActiveDirectoryFederationServicesBearerAuthentication(
            new ActiveDirectoryFederationServicesBearerAuthenticationOptions
            {
                MetadataEndpoint = ConfigurationManager.AppSettings["ida:AdfsMetadataEndpoint"],
                TokenValidationParameters = new TokenValidationParameters() { ValidAudience = ConfigurationManager.AppSettings["ida:Audience"] }
            });
    }
看起来这个中间件需要JWT令牌(假定类上有JwtSecurityTokenHandler)。我们在ADFS端是否需要进行任何配置来发行JWT令牌?我的理解是,默认情况下我将收到一个SAML令牌

我们应该使用CookieAuthentication中间件来管理令牌,还是浏览器会在会话的整个生命周期中一直包含令牌

谢谢大家

更新: 因此,基于下面维托里奥的帮助和一些进一步的研究,我现在有了一个简单的网站,只有一个页面受[Authorize]属性保护。我的启动类的ConfigureAuth方法现在如下所示:

    public void ConfigureAuth(IAppBuilder app)
    {
        app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

        app.UseCookieAuthentication(new CookieAuthenticationOptions());

        app.UseActiveDirectoryFederationServicesBearerAuthentication(
            new ActiveDirectoryFederationServicesBearerAuthenticationOptions
            {
                MetadataEndpoint = ConfigurationManager.AppSettings["ida:AdfsMetadataEndpoint"],
                TokenValidationParameters = new TokenValidationParameters() { ValidAudience = ConfigurationManager.AppSettings["ida:Audience"] }
            });
    }
我们已将我的网站添加为ADF中的依赖方信托,并创建了六条索赔规则。到目前为止,一切似乎都是正确的,但我仍在努力。我点击受保护的“声明”页面,得到一个401响应,带有WWW-Authenticate:Bearer头。到目前为止,一切顺利

但就是这样。浏览器如何知道在哪里获得身份验证和接收令牌?如果我正在验证单独的客户端场景,我的客户端将配置令牌授权的位置,但是在这个简单的网站场景中,我显然遗漏了一些东西

更新2: 我想知道内部ADF的实现是否还没有准备好?或者可能文档还不存在,或者两者都不存在

我取出了所有Owin包,恢复使用WSFederationAuthenticationModule和SessionAuthenticationModule,以及system.identityModel和system-identityModel.services中的所有web.config设置,这些设置已经存在了一段时间。基本上,我使解决方案与您在选择组织帐户-->内部部署时从VS2013获得的解决方案类似。一切都运行得很好,我的所有配置声明都来自ADFS。我看到最初的302重定向到ADFS(质询响应),并最终将SAML令牌序列化到安全会话cookie中。在网站上,我回应了这样的说法:

var user = User as ClaimsPrincipal;
ViewBag.Claims = user.Claims;
return View();
这就是我怀疑中间件不完整的原因:当您在VS2013中使用新模板时,向导会转到您指定的联合元数据端点,并通过读取该xml构建所有web.config设置,此外,还会设置一些智能默认值。这正是我期望在Owin中间件中发生的事情——它应该拥有它需要知道的一切,因为我传入了相同的元数据端点。我希望“magic”将取代使用FAM/SAM模块和所有附带的配置。

1)如果您正在配置web UX应用程序,这意味着要通过浏览器重定向使用,您希望使用。在这种情况下,您将看到cookie中间件确实发挥了作用

2) 如果您正在配置web API,如富客户机或其他服务器使用的web API,或一般情况下非浏览器往返的web API,请参阅。在这种情况下,您不需要cookies,因为没有会话-每个呼叫都必须携带令牌


V.

正如Vittorio所说,如果您使用web api或仅使用web api创建网页,则需要进行区分。关注他的博客帖子,他们很棒

如果在IIS中承载仅webapi项目,则需要将身份验证设置为“forms authentication”。 如果您的web api包含在web应用程序代理后面,那么这也适用。确保将端点(已发布的web应用程序)配置为不进行预验证。“预验证”的值应为“通过”


bg Andrej

谢谢。我从场景1开始,所以我也配置了cookie中间件?是否存在CSRF风险?Cookies将自动包含在每个请求中。。。选项2是代币吗?如果您使用JS前端,则需要将承载令牌持久化到HTML5会话存储中,然后将其包含在每个请求中?您是否尝试过从客户端的cookie中获取承载令牌(使用javascript)并将其放入请求授权中