如何将现有的asp.net MVC应用程序与IdentityServer集成?

14
我如何将现有的asp.net MVC应用程序与单独的IdentityServer应用程序集成?
我有一个现有的asp.net MVC网站,使用身份验证2.0进行身份验证。
我现在有第二个应用程序运行asp.net Core 1.1,用于提供API,这些API与客户端(移动)应用程序通信。
我需要在这3个应用程序之间共享身份验证。
据我所知,我需要添加SSO,IdentityServer似乎是解决此问题的好方法。我计划将IdentityServer设置为第4个应用程序,并将其连接到新的.net API应用程序和客户端应用程序。
但我找不到任何示例,说明如何让我的现有Asp.net应用程序使用新的身份验证服务器进行身份验证。

你说你在使用Identity 2.0来进行ASP.NET MVC应用程序的身份验证。它是像Google这样的外部身份提供者吗?在切换到Identity Server 4后,您是否想要保留它? - Ignas
不,所有的身份验证都是内部的,没有外部提供者。在切换后我不需要继续使用它。 - Robbie Mills
2个回答

7
您将有4个应用程序,如您所述。
  1. IdentityServer4是用于身份和访问控制的应用程序。它将成为SSO服务和STS(安全令牌服务)-权威机构。截至今天,您将在ASP.NET Core 1.1中构建此应用程序。要成为SSO,您当然需要拥有用户数据库;使用ASP.NET Identity效果很好,并与IdentityServer集成得很好。

  2. 您的Web API运行在ASP.NET Core 1.1上,这在OAuth术语中称为API资源。您可以将此API细分为可单独保护的部分,称为API范围。

  3. 现有的MVC Web应用程序使用ASP.NET Identity中的当前用户数据库。这将是IdentityServer权威机构(#1)的客户端。您可以选择授权码流程(更加安全)或选择隐式或混合流程。如何将ASP.NET MVC Web应用程序设置为IdentityServer实例的客户端的示例可以在其官方文档中找到:http://docs.identityserver.io/en/latest/quickstarts/3_interactive_login.html#creating-an-mvc-client

基本上,您需要执行以下操作:
(a)将客户端注册到IdentityServer中,然后
(b)在客户端应用程序中添加一些启动代码,以便告诉它使用IdentityServer进行身份验证-类似于这样的内容...
app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions
{
    AuthenticationScheme = "oidc",
    SignInScheme = "Cookies",

    Authority = "http://localhost:5000",
    RequireHttpsMetadata = false,

    ClientId = "mvc",
    SaveTokens = true
});

您可以同时使用内部用户数据库和外部IdentityServer进行登录,也就是说,您可以用两种不同的方式登录MVC Web应用程序。IdentityServer应用程序可以被视为MVC Web应用程序的“外部提供者”。
您是否打算将现有的用户名和密码(以及角色等)迁移到新的IdentityServer实例/数据库?要实现跨应用程序的SSO和共享身份和访问控制,必须回答“是”。
只有用户使用IdentityServer应用程序登录才能实现SSO。但是,由于他们在桌面计算机上使用浏览器,在手机上使用移动应用程序,因此实际上可能无法实现SSO-无法在设备之间共享cookie或令牌。
第四点是移动客户端。这将是另一个客户端,类似于MVC Web应用程序,但一定要使用Implicit Flow。同样,注册客户端,然后编写应用程序。

4
你可以使用 IdentityServer4 来构建身份验证应用程序。将每个应用程序视为 IdentityServer4 客户端和 API 视为 ApiResources,因此它们都将具有唯一的 clientidcallback uri 等。你需要向 API 添加 IdentityServerAuthenticationOptions,并向 MVC 应用程序添加 OpenIdConnectOptions

例如,WebAPI 的 Startup.cs 可能包含以下内容:

public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();

    app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions
    {
        Authority = "http://localhost:5000",
        RequireHttpsMetadata = false,

        ApiName = "api1"
    });

    app.UseMvc();
}

无论如何,首先您需要了解IdentityServer的工作原理。然后您需要构建identityserver应用程序,该应用程序将访问您的用户上下文。通过允许相同的api scope,您将实现跨三个应用程序共享身份验证。

这是开始的最佳位置


链接已经失效。 - anatol

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接