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

How do I integrate an existing asp.net MVC application with IdentityServer?

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

我有一个现有的 asp.net MVC 站点使用 identity 2.0 进行身份验证。

我现在有第二个应用程序 运行 asp.net Core 1.1,它服务于 API 的客户端(移动)应用程序。

我需要在所有 3 个应用程序之间共享身份验证。

据我了解,我需要添加 SSO,而 IdentityServer 似乎是一个很好的解决方案。我计划将 IdentityServer 设置为第四个应用程序并将其连接到新的 .net API 应用程序和客户端应用程序。

但是我找不到任何示例来说明如何让我现有的 Asp.net 应用程序使用新的身份服务器进行身份验证。

您使用 IdentityServer4. Treat each of your application as an identityServer4 client and API as ApiResources 构建身份验证应用程序,因此它们都将具有唯一的 clientidcallback uri 等。您需要将 IdentityServerAuthenticationOptions 添加到 API, 和 OpenIdConnectOptions 到 mvc 应用程序。

例如,一个网站API 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是如何工作的。然后您需要构建身份服务器应用程序,它将访问您的用户上下文。 您将通过允许相同的 api scope.

实现跨三个应用程序的共享身份验证

this is the best place to start

如您所说,您将有 4 个应用程序。

  1. 用于身份和访问控制的 IdentityServer4 应用程序。这将是 SSO 服务和 STS(安全令牌服务)- 权限。从今天开始,您将在 ASP.NET 核心 1.1 中构建它。要成为 SSO,您当然需要有一个用户数据库;使用 ASP.NET Identity 可以很好地与 IdentityServer 集成。

  2. 您的网站 API,您说的是 运行 ASP.NET Core 1.1。在 OAuth 术语中,这称为 API 资源 。您可以将此 API 细分为单独的安全部分,称为 API Scopes.

  3. 现有 MVC web 应用程序与您当前的用户数据库在 ASP.NET 身份。这将是 IdentityServer 权限的 Client(上面的#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 网络应用程序的 "external provider"。

您是否打算将现有的用户名和密码(以及角色等)迁移到新的 IdentityServer instance/database?此答案必须 "yes" 才能实现 SSO 以及跨应用程序的共享身份和访问控制。

只有当用户使用 IdentityServer 应用程序登录时,SSO 才有可能。但是,您可能不会真正实现 SSO,因为他们在台式机上使用浏览器,在 phone 上使用移动应用程序 - 无法跨设备共享 cookie 或令牌。

  1. 移动客户端。这将是另一个像 MVC 网络应用程序一样的客户端,除了肯定使用隐式流。再次注册客户端,然后对应用程序进行编码。