ASP.NET Core的身份認證框架IdentityServer4--(5)自定義用戶登錄(通過接口登錄,無UI版本)


官網接口詳解文檔地址文檔地址 (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 的值。

通過調用上面兩個接口,完成登錄授權。

效果圖:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM