官網接口詳解文檔地址:文檔地址 (PS:可通過接口名稱搜索相應接口信息。)
源碼地址:https://github.com/YANGKANG01/IdentityServer4-IdentityAuth
一、修改服務端
1、修改Startup
文件源碼如下:
namespace Server { public class Startup { public void ConfigureServices(IServiceCollection services) { //配置身份服務器與內存中的存儲,密鑰,客戶端和資源 services.AddIdentityServer() .AddDeveloperSigningCredential() .AddInMemoryIdentityResources(Config.GetIdentityResources());//添加對OpenID Connect的支持 .AddInMemoryApiResources(Config.GetApiResources())//添加api資源 .AddInMemoryClients(Config.GetClients())//添加客戶端 .AddResourceOwnerValidator<LoginValidator>()//用戶校驗 .AddProfileService<ProfileService>(); } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } //添加到HTTP管道中。 app.UseIdentityServer(); } } }
2、修改config
文件
namespace Server { public class Config { /// <summary> /// 添加對OpenID Connect的支持 /// </summary> /// <returns></returns> public static IEnumerable<IdentityResource> GetIdentityResources() { return new List<IdentityResource> { new IdentityResources.OpenId(), //必須要添加,否則報無效的scope錯誤 new IdentityResources.Profile() }; } /// <summary> /// 范圍定義系統中的API資源 /// </summary> /// <returns></returns> public static IEnumerable<ApiResource> GetApiResources() { return new List<ApiResource> { new ApiResource("api1", "My API") }; } /// <summary> /// 客戶想要訪問資源(又稱范圍) /// </summary> /// <returns></returns> public static IEnumerable<Client> GetClients() { // 客戶端信息 return new List<Client> { //自定義客戶端 new Client { //客戶端名稱 ClientId = "client1", //客戶端訪問方式:密碼驗證 AllowedGrantTypes = GrantTypes.ResourceOwnerPassword, //用於認證的密碼加密方式 ClientSecrets = { new Secret("secret".Sha256()) }, //客戶端有權訪問的范圍 AllowedScopes = { "api1",IdentityServerConstants.StandardScopes.OpenId, //必須要添加,否則報403 forbidden錯誤 IdentityServerConstants.StandardScopes.Profile } } }; } } }
3、新建LoginValidator
類,用於用戶校驗
namespace Server { /// <summary> /// 自定義用戶登錄校驗 /// </summary> public class LoginValidator : IResourceOwnerPasswordValidator { public LoginValidator() { } /// <summary> /// 登錄用戶校驗 /// </summary> /// <param name="context"></param> /// <returns></returns> public async Task ValidateAsync(ResourceOwnerPasswordValidationContext context) { //根據context.UserName和context.Password與數據庫的數據做校驗,判斷是否合法 if (context.UserName == "test" && context.Password == "123") { context.Result = new GrantValidationResult( subject: context.UserName, authenticationMethod: "custom", claims: GetUserClaims()); } else { //驗證失敗 context.Result = new GrantValidationResult(TokenRequestErrors.InvalidGrant, "賬號密碼錯誤"); } } /// <summary> /// 可以根據需要設置相應的Claim /// </summary> /// <returns></returns> private Claim[] GetUserClaims() { return new Claim[] { new Claim("UserId", 1.ToString()), new Claim(JwtClaimTypes.Name,"test"), new Claim(JwtClaimTypes.GivenName, "jaycewu"), new Claim(JwtClaimTypes.FamilyName, "yyy"), new Claim(JwtClaimTypes.Email, "test@qq.com"), new Claim(JwtClaimTypes.Role,"admin") }; } } }
4、新建ProfileService
類,用於返回用戶自定義信息
namespace Server { /// <summary> /// 獲取用戶信息並返回給客戶端 /// </summary> public class ProfileService : IProfileService { /// <summary> /// 獲取用戶信息 /// </summary> /// <param name="context"></param> /// <returns></returns> public async Task GetProfileDataAsync(ProfileDataRequestContext context) { try { //用戶信息 var claims = context.Subject.Claims.ToList(); //獲取用戶信息 context.IssuedClaims = claims.ToList(); } catch (Exception ex) { //log your error } } /// <summary> /// 獲取或設置一個值,該值指示主題是否處於活動狀態並且可以接收令牌。 /// </summary> /// <param name="context"></param> /// <returns></returns> public async Task IsActiveAsync(IsActiveContext context) { context.IsActive = true; } } }
5、通過接口獲取用戶信息
5.1、用戶登錄接口:http://localhost:5000/connect/token
參數名 | 說明 | 是否必填 | 示例 |
username | 用戶名 | Y | test |
password | 密碼 | Y | 123 |
grant_type | 加密類型 | Y | password |
client_id | 客戶端名稱 | Y | client1 |
client_secret | 客戶端加密類型 | Y | secret |
效果圖:
5.2、獲取用戶信息接口:http://localhost:5000/connect/userinfo
參數 | 是否必填 | 說明 |
Authorization | Y | 值的格式:key空格value |
PS:key 的值為上面接口返回的 token_type 的值,value 為 access_token 的值。
通過調用上面兩個接口,完成登錄授權。
效果圖: