共计 1901 个字符,预计需要花费 5 分钟才能阅读完成。
基于 IdentityServer4 构建认证授权体系
环境搭建与核心配置
服务端创建: 新建 ASP.NET Core 2.0 空项目 QuickstartIdentityServer(端口 5000),通过 NuGet 集成 IdentityServer4 包。
services.AddIdentityServer()
.AddDeveloperSigningCredential()
.AddInMemoryIdentityResources(Config.GetIdentityResourceResources())
.AddInMemoryApiResources(Config.GetApiResources())
.AddInMemoryClients(Config.GetClients())
.AddResourceOwnerValidator()
.AddProfileService();
关键配置模块实现
资源配置类: 定义身份资源、API 资源和客户端信息,特别注意 OpenID 与 Profile 的必填配置。
public static IEnumerable GetClients()
{return new List {
new Client {
ClientId = "client2",
AllowedGrantTypes = GrantTypes.ResourceOwnerPassword,
ClientSecrets = {new Secret("secret".Sha256()) },
AllowedScopes = {"api1", IdentityServerConstants.StandardScopes.OpenId}
}
};
}
用户认证逻辑开发
密码验证器: 继承 IResourceOwnerPasswordValidator 实现数据库校验逻辑,构建用户声明集合。
public async Task ValidateAsync(ResourceOwnerPasswordValidationContext context)
{if(context.UserName=="wjk" && context.Password=="123")
{
context.Result = new GrantValidationResult(
subject: context.UserName,
authenticationMethod: "custom",
claims: BuildUserClaims());
}
}
客户端 API 集成方案
新建 ASP.NET Core 2.0 API 项目 (端口 5001),配置 Bearer 认证并注入授权过滤器:
services.AddAuthentication("Bearer")
.AddIdentityServerAuthentication(options => {
options.Authority = "http://localhost:5000";
options.ApiName = "api1";
});
声明数据获取方式
通过 HttpContext.User.Claims 可直接获取用户声明信息:
[TestAuthorize("User_Edit")]
public IActionResult Get()
{return Json(HttpContext.User.Claims.Select(c => new {c.Type, c.Value}));
}
自定义权限控制实现
混合授权方案: 结合授权过滤器和自定义特性实现细粒度控制
public class AuthFilter : IAuthorizationFilter
{public void OnAuthorization(AuthorizationFilterContext context)
{
var userPermissions = "User_Edit";
if(!authorizeAttributes.Any(a => a.Permission == userPermissions))
{context.Result = new JsonResult("权限不足");
}
}
}
特性标注: 扩展 AuthorizeAttribute 实现权限码标注
[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method)]
public class TestAuthorizeAttribute : AuthorizeAttribute
{public string Permission { get;}
public TestAuthorizeAttribute(string permission) => Permission = permission;
}
正文完