IdentityServer4实战:Token认证与权限控制集成指南

72次阅读

共计 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;
}
正文完
 0