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

问题描述:

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

我有一个现有的asp.net MVC网站使用标识2.0身份验证。

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

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

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

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

+0

你说你使用身份2.0认证的asp.net MVC应用程序。它是像Google这样的外部身份提供者吗?您想在切换到Identity Server 4后保留它吗? – Ignas

+0

不,所有的认证都是内部的,没有外部提供者。切换后我不需要继续使用它 –

你将有4个应用程序,你说。

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

  2. 您的Web API,您说的是运行ASP.NET Core 1.1。以OAuth的形式,这被称为API资源。你可以把这个API分成几个单独的安全部分,称为API范围

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

从本质上讲,你

(一)注册IdentityServer客户端,然后

(b)增加在客户端应用程序的启动代码会告诉它使用IdentityServer的认证 - 东西像这样...

app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions 
{ 
    AuthenticationScheme = "oidc", 
    SignInScheme = "Cookies", 

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

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

你可以在这一点上都使用在记录,以及作为外部IdentityServer-内部用户数据库,您可以登录我n以MVC Web应用程序两种不同的方式。 IdentityServer应用程序可以被视为您的MVC网络应用程序的“外部提供者”。

您打算将现有的用户名和密码(以及角色等)迁移到新的IdentityServer实例/数据库吗?这个答案必须是“是”才能实现跨应用程序的SSO和共享身份和访问控制。

SSO只有在用户使用IdentityServer应用程序登录时才有可能。虽然,您可能实际上不会实现SSO,因为他们在桌面计算机上使用浏览器,在手机上使用移动应用程序,但实际上无法跨设备共享Cookie或令牌。

  1. 移动客户端。这将是MVC网络应用程序之外的另一个客户端,除非明确使用隐式流。再次注册客户端,然后编写应用程序代码。

您使用IdentityServer4构建您的身份验证应用程序。将您的每个应用程序作为identityServer4客户端和API作为ApiResources,因此它们都将具有唯一的clientid,callback uri等。您需要将IdentityServerAuthenticationOptions添加到API,并将OpenIdConnectOptions添加到mvc应用程序。

例如,的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跨三个应用程序实现共享验证。

而且this is the best place to start