Active directory 使用OWIN Active Directory承载令牌启用多个租户

Active directory 使用OWIN Active Directory承载令牌启用多个租户,active-directory,owin,adal,Active Directory,Owin,Adal,我最近开始使用Azure Active Directory,根据基于AngularJS构建的网站对用户进行身份验证 使用博客和,我已经让它与单一租户一起使用和Katana的组合 但是,我现在在支持多个租户方面遇到了一些问题 我已经设置了一个页面,显示ADAL看到的用户(通过根作用域的userInfo找到),并调用OWIN接收的我的服务器,序列化context.Authentication.user 客户端,一切似乎都正常工作。我可以与我的任何租户一起登录,它会给我期望的对象(使用isAuthen

我最近开始使用Azure Active Directory,根据基于AngularJS构建的网站对用户进行身份验证

使用博客和,我已经让它与单一租户一起使用和Katana的组合

但是,我现在在支持多个租户方面遇到了一些问题

我已经设置了一个页面,显示ADAL看到的用户(通过根作用域的
userInfo
找到),并调用OWIN接收的我的服务器,序列化
context.Authentication.user

客户端,一切似乎都正常工作。我可以与我的任何租户一起登录,它会给我期望的对象(使用
isAuthenticated:true
username
填充,以及
profile
上描述用户、登录和租户的各种属性)

这是通过在客户端将
tenant
参数保留到my
adalAuthenticationServiceProvider.init
调用来实现的,如文档中所述

但是,服务器端的
useWindowsAzureActiveDirectoryBeareAuthentication
方法不喜欢对
Tenant
没有值(因为它会引发异常)。我为此尝试了一些值,包括我的应用程序最初注册的租户,以及我的逻辑最爱“common”,但无论我在其中添加了什么(除非是我尝试登录的租户,并且如果我的ADAL是与该租户一起设置的),它似乎都跳过了这一点

值得一提的是,实际的API调用在
[Authorize]
过滤器上失败,并返回401,这告诉我这不是我的OWIN拦截器的问题


如何判断
使用WindowsAzureActiveDirectoryBeareAuthentication
支持多租户身份验证?

我在写问题时发现了这一点。我想。但我花了一整天的时间在这件事上,发现几乎没有关于这件事的文档,所以我想我还是要把它贴出来

我的解决方案(通过找到)是将
validateisuer=false
作为一个参数。这是有意义的,因为我们不再想验证给我们令牌的租户是否就是我们列出的那个

这是我解决这个问题的代码

app.UseWindowsAzureActiveDirectoryBearerAuthentication(
            new WindowsAzureActiveDirectoryBearerAuthenticationOptions
            {
                TokenValidationParameters = new TokenValidationParameters
                {
                    ValidAudience = ConfigurationManager.AppSettings["ida:Audience"],
                    ValidateIssuer = false // This line made it work
                },
                AuthenticationMode = Microsoft.Owin.Security.AuthenticationMode.Active,
                Tenant = "common" // I don't know whether this has any impact,
                                  // but it's a required parameter regardless.
            });

如果有任何不可预见的情况,我希望其他人能纠正我——在进行身份验证时,将“验证”开关切换为“关闭”有点令人生畏。但我认为这一切都是有道理的。

在开发多租户应用程序时,您不能再100%依赖默认的身份验证逻辑。默认身份验证逻辑假定您声明azure AD租户表单,您希望在其中接收令牌,并且将强制执行该租户接受的令牌表单。这是通过检查与每个租户相关联的元数据文档来实现的,其中包含(除其他外)租户本身的标识符——该标识符必须出现在iss声明中您收到的令牌中:任何其他值都意味着令牌来自另一个租户,因此必须拒绝。 根据定义,多租户应用程序必须接受来自多个租户的令牌。这是通过使用参数化端点(公共端点,请参阅)来完成的,该端点允许您“后期绑定”将用于发布令牌的租户。但是,公共端点将提供一个通用元数据文档,该文档不能包含特定的iss值:相反,它包含一个占位符,在运行时该占位符将始终替换为您实际从中获得令牌的租户的颁发者标识符。
这意味着在多租户应用程序中,您必须接管租户验证逻辑。如果您只是在调试,您可以关闭它,就像您看起来已经做的那样-这将阻止默认颁发者验证逻辑启动并拒绝传入令牌,因为它的iss值与找到的公共占位符不对应。但是,在更现实的情况下,您将在
TokenValidationParameters.IssuerValidator
委托中编写自己的逻辑。例如,您可能希望将传入令牌中的iss值与购买每月服务订阅的租户列表进行比较。嗯

是的,这是有道理的。我的问题与其说是关于这一切的理论,不如说是关于这门课如何完成它的实际机制。但是谢谢你提供的信息。说到实际的力学,你知道OWIN逻辑能处理多少吗?我对设置
validateisuer=false
的关注仅仅是在身份验证方面,我已经处理了授权。只要我能确定set issuer实际上是发出请求的租户,我就是golden。你应该看看下面关于该配置的评论:而不是使用默认验证(根据单个issuer值进行验证,就像我们在业务线应用程序中所做的那样),//我们注入我们自己的多租户验证logic@ken谢谢你给我指出这个网址。。。我在找那个密码。我以前见过它,但在谷歌上找不到。