MVC多租户应用程序,每个租户具有不同的身份验证

时间:2017-10-24 18:03:26

标签: asp.net-mvc owin azure-active-directory multi-tenant adfs

我一直在寻找关于我的方案的可行架构的许多小时。

我们希望有一个多租户MVC应用程序,其中每个租户属于不同的公司。 每个租户都有可以配置其身份验证类型的设置:客户AD或表单。

是否可以允许每家公司使用自己的活动目录登录?或者默认情况下,如果他们没有AD,我们会使用表单身份验证。

我已经阅读了一些关于Azure AD,AD联合服务+ WIF(或更近期的OWIN)的文章,但我希望获得有关实现它的解决方案的一些指导。

由于

5 个答案:

答案 0 :(得分:2)

这是Azure AD中非常标准的方案。您将要在Azure portal中注册Azure AD应用程序,并使用OWIN OpenIdConnect中间件进行登录/会话管理。如果您还想调用Web API或Microsoft Graph,您可能还需要包含ADAL(Active Directory身份验证库)以帮助交换令牌的身份验证代码。

这是一个很棒的代码示例,向您展示如何构建.NET multitenant MVC App。此外,这些内容的其他文档可以在Azure AD developer page找到。

答案 1 :(得分:0)

之前完成此操作,我的方式是使用并且每个租户通过依赖注入覆盖SignIn Manager

登录管理器是进行身份验证的地方,所以没有一个 drop-in框架只是这样做(我知道),但只是覆盖了几个方法单个课程非常简单。

答案 2 :(得分:0)

您是否考虑过Azure AD B2C?您可以让用户使用他们的公司电子邮件/ AD登录。

看看这里:https://azure.microsoft.com/en-us/services/active-directory-b2c/?cdn=disable

答案 3 :(得分:0)

根据其他答案,Azure AD允许多租户。只需在配置中选中一个复选框。

但是,标准的身份验证方式是OpenID Connect / OAuth。

此外,您无法更改身份验证模式。

您提到ADFS和内部部署AD。这些适合哪些?

答案 4 :(得分:0)

使用ASP.NET Identity和OpenID connect,您将获得此功能。 ASP.NET Identity具有本地帐户,使用OpenID Connect到Azure AD,您可以让用户使用其Azure AD帐户登录。

应用程序定义必须是多租户应用程序。

如果您使用的是ASP.NET Core,则可以按照说明here进行操作,然后按照说明添加OpenID Connect,例如here或仅在app.UseIdentity来电后添​​加与此类似的代码:

            // Add Authentication services.
            services.AddAuthentication()
                // Configure the OWIN pipeline to use OpenID Connect auth.
                .AddOpenIdConnect(option =>
                {
                    option.ClientId = Configuration["AzureAD:ClientId"];
                    option.Authority = String.Format(Configuration["AzureAd:AadInstance"], Configuration["AzureAd:Tenant"]);
                    option.SignedOutRedirectUri = Configuration["AzureAd:PostLogoutRedirectUri"];
                    option.Events = new OpenIdConnectEvents
                    {
                        OnRemoteFailure = OnAuthenticationFailed,
                    };
                });

如果您使用个人用户帐户创建新应用,则可以使用ConfigureServices Startup.cs方法在Task task = taskService.findById(6); User user = task.getUser(); //HERE user.getTasks().remove(task); //..and HERE task.setUser(null); taskService.save(task); 方法中添加上述代码,然后您就可以了