使用IdentityServer4 實現OpenID Connect服務端,添加用戶身份驗證。客戶端調用,實現受權。html
IdentityServer4 目前已更新至1.0 版,在以前的文章中有所介紹。IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架學習保護API 。git
本文環境:IdentityServer4 1.0 .NET Core 1.0.1github
下面正式開始。web
新建IdentityServer4服務端
服務端也就是提供服務,如QQ Weibo等。shell
新建一個ASP.NET Core Web Application 項目IdentityServer4OpenID,選擇模板Web 應用程序 不進行身份驗證。mvc
刪除模板建立的Controllers 文件以及Views 文件夾。app
添加IdentityServer4 引用:框架
Install-Package IdentityServer4ide
而後添加配置類Config.cs:post
public class Config { //定義系統中的資源 public static IEnumerable<IdentityResource> GetIdentityResources() { return new List<IdentityResource> { new IdentityResources.OpenId(), new IdentityResources.Profile(), }; } public static IEnumerable<Client> GetClients() { // 客戶端憑據 return new List<Client> { // OpenID Connect implicit 客戶端 (MVC) new Client { ClientId = "mvc", ClientName = "MVC Client", AllowedGrantTypes = GrantTypes.Implicit, RedirectUris = { "http://localhost:5002/signin-oidc" }, PostLogoutRedirectUris = { "http://localhost:5002" }, //運行訪問的資源 AllowedScopes = { IdentityServerConstants.StandardScopes.OpenId, IdentityServerConstants.StandardScopes.Profile } } }; } //測試用戶 public static List<TestUser> GetUsers() { return new List<TestUser> { new TestUser { SubjectId = "1", Username = "admin", Password = "123456", Claims = new List<Claim> { new Claim("name", "admin"), new Claim("website", "https://www.cnblogs.com/linezero") } }, new TestUser { SubjectId = "2", Username = "linezero", Password = "123456", Claims = new List<Claim> { new Claim("name", "linezero"), new Claim("website", "https://github.com/linezero") } } }; } }
以上使用IdentityServer4測試數據類添加數據,直接存在內存中。IdentityServer4 是支持持久化。
而後打開Startup.cs 加入以下:
public void ConfigureServices(IServiceCollection services) { // Add framework services. services.AddMvc(); services.AddIdentityServer() .AddTemporarySigningCredential() .AddInMemoryIdentityResources(Config.GetIdentityResources()) .AddInMemoryClients(Config.GetClients()) .AddTestUsers(Config.GetUsers()); } public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { ... app.UseIdentityServer(); ...
接着安裝UI,UI部分也能夠本身編寫,也就是登陸 註銷 容許和錯誤。
能夠到 https://github.com/IdentityServer/IdentityServer4.Quickstart.UI/tree/release 下載,而後解壓到項目目錄下。
也能夠使用命令提示符快速安裝:
powershell iex ((New-Object System.Net.WebClient).DownloadString('https://raw.githubusercontent.com/IdentityServer/IdentityServer4.Quickstart.UI/release/get.ps1'))
在項目目錄下打開命令提示符,輸入以上命令。
更多信息,能夠查看官方readme:https://github.com/IdentityServer/IdentityServer4.Quickstart.UI/blob/release/README.md
新建MVC客戶端
接着新建一個MVC客戶端,能夠理解爲你本身的應用,須要使用第三方提供的服務。
新建一個ASP.NET Core Web Application 項目MvcClient,選擇模板Web 應用程序 不進行身份驗證。
配置Url 綁定5002端口 UseUrls("http://localhost:5002")
而後添加引用:
Install-Package Microsoft.AspNetCore.Authentication.Cookies
Install-Package Microsoft.AspNetCore.Authentication.OpenIdConnect
本文最終所引用的爲1.1 。
接着打開Startup類,在Configure方法中添加以下代碼:
app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationScheme = "Cookies" }); app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions { AuthenticationScheme = "oidc", SignInScheme = "Cookies", Authority = "http://localhost:5000", RequireHttpsMetadata = false, ClientId = "mvc", SaveTokens = true });
而後在HomeController 加上[Authorize] 特性,HomeController是VS2015 模板建立的,如沒有能夠自行建立。
而後更改Home文件夾下的Index視圖以下:
<dl> @foreach (var claim in User.Claims) { <dt>@claim.Type</dt> <dd>@claim.Value</dd> } </dl>
運行
首先運行服務端,定位到項目目錄下dotnet run,運行起服務端之後,訪問http://localhost:5000 ,確認是否正常訪問。
能正常訪問接着運行客戶端,一樣是dotnet run ,而後訪問http://localhost:5002,會默認跳轉至http://localhost:5000 ,這樣也就對了。
最終效果以下:
這裏UI部分就是官方UI,咱們也能夠自行設計應用到本身的系統中。登陸的用戶是配置的測試用戶,受權之後能夠看到配置的Claims。
本文所採用的 Grant 爲 Implicit,更爲詳細的OAuth 2.0 https://tools.ietf.org/html/rfc6749 。
示例GitHub:https://github.com/linezero/Blog/tree/master/IdentityServer4OpenID
參考官方文檔:https://identityserver4.readthedocs.io/en/release/quickstarts/3_interactive_login.html
轉自:https://www.cnblogs.com/linezero/p/identityserver4openidconnect.html