如何将现有的asp.net MVC应用程序与单独的IdentityServer应用程序集成?
我有一个现有的asp.net MVC网站,使用身份2.0进行身份验证。
我现在有了第二个运行asp.net Core 1.1的应用程序,它为API提供服务,该API与客户端(移动)应用程序对话。
我需要在所有3个应用程序之间共享身份验证。
根据我所读到的内容,我需要添加SSO,而IdentityServer似乎是一个很好的解决方案。我计划将IdentityServer设置为第四个应用程序,并将其连接到新的.net API应用程序和客户端应用程序。
但是我找不到任何例子来说明如何让我现有的Asp.net应用程序使用新的身份服务器进行身份验证。
您将有4个应用程序。
-
用于身份和访问控制的IdentityServer4应用程序。这将是SSO服务和STS(安全令牌服务)-权威机构。从今天起,您将在ASP.NET核心1.1中构建它。要成为SSO,您当然需要有一个用户数据库;使用ASP.NET Identity运行良好,并与IdentityServer很好地集成。
-
您的Web API,您说它正在运行ASP.NET Core 1.1。用OAuth的术语来说,这被称为API资源。您可以将此API细分为单独的安全部分,称为API范围。
-
ASP.NET Identity中具有当前用户数据库的现有MVC web应用程序。这将是Identity Server授权机构的客户端(上面的#1)。您可以使用授权代码流(更安全)或选择隐式或混合流。关于如何将ASP.NET MVC web应用程序设置为Identity Server实例的客户端的示例,可以在其官方文档中找到:http://docs.identityserver.io/en/latest/quickstarts/3_interactive_login.html#creating-mvc客户端。
本质上,你的
(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应用程序的"外部提供者"。
您是否要将现有用户名和密码(以及角色等)迁移到新的Identity Server实例/数据库?答案必须是"是",才能实现SSO和跨应用程序的共享身份和访问控制。
只有当用户使用IdentityServer应用程序登录时,才可能使用SSO。不过,您可能不会真正实现SSO,因为他们在台式机上使用浏览器,在手机上使用移动应用程序,而无法在设备之间共享cookie或令牌。
- 移动客户端。这将是另一个类似MVC web应用程序的客户端,当然除了使用隐式流。再次注册客户端,然后对应用程序进行编码
使用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
,您将在三个应用程序之间实现共享身份验证
这是启动的最佳场所