如何通过ASP.NET Core自定义验证属性实现精细化的访问权限控制?
- 内容介绍
- 文章标签
- 相关推荐
本文共计814个文字,预计阅读时间需要4分钟。
前言:家都知道,在应用中,有时我们需要对访问的客户端进行有效性验证。只有提供有效凭证(如AccessToken)的终端应用才能访问我们的受控站点(如WebAPI站点)。此时,我们可以通过验证属性来确认。
前言
大家都知道在应用中,有时我们需要对访问的客户端进行有效性验证,只有提供有效凭证(AccessToken)的终端应用能访问我们的受控站点(如WebAPI站点),此时我们可以通过验证属性的方法来解决。
本文将详细介绍ASP.NET Core使用自定义验证属性控制访问权限的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧
方法如下
一、public class Startup的配置:
//启用跨域访问(不同端口也是跨域) services.AddCors(options => { options.AddPolicy("AllowOriginOtherBis", builder => builder.WithOrigins("1.16.9.12:4432", "pc12.ato.biz:4432", "localhost:44384", "1.16.9.12:4432", "pc12.ato.biz:4432").AllowAnyMethod().AllowAnyHeader()); }); //启用自定义属性以便对控制器或Action进行[TerminalApp()]定义。 services.AddSingleton<IAuthorizationHandler, TerminalAppAuthorizationHandler>(); services.AddAuthorization(options => { options.AddPolicy("TerminalApp", policyBuilder => { policyBuilder.Requirements.Add(new TerminalAppAuthorizationRequirement()); }); });
二、public void Configure(IApplicationBuilder app, IHostingEnvironment env)中的配置:
app.UseHttpsRedirection(); //使用Https传输 app.UseCors("AllowOriginOtherBis"); //根据定义启用跨域设置
三、示例WebApi项目结构:
四、主要代码(我采用的从数据库进行验证):
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)] internal class TerminalAppAttribute : AuthorizeAttribute { public string AppID { get; } /// <summary> /// 指定客户端访问API /// </summary> /// <param name="appID"></param> public TerminalAppAttribute(string appID="") : base("TerminalApp") { AppID = appID; } }
public abstract class AttributeAuthorizationHandler<TRequirement, TAttribute> : AuthorizationHandler<TRequirement> where TRequirement : IAuthorizationRequirement where TAttribute : Attribute { protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, TRequirement requirement) { var attributes = new List<TAttribute>(); if ((context.Resource as AuthorizationFilterContext)?.ActionDescriptor is ControllerActionDescriptor action) { attributes.AddRange(GetAttributes(action.ControllerTypeInfo.UnderlyingSystemType)); attributes.AddRange(GetAttributes(action.MethodInfo)); } return HandleRequirementAsync(context, requirement, attributes); } protected abstract Task HandleRequirementAsync(AuthorizationHandlerContext context, TRequirement requirement, IEnumerable<TAttribute> attributes); private static IEnumerable<TAttribute> GetAttributes(MemberInfo memberInfo) { return memberInfo.GetCustomAttributes(typeof(TAttribute), false).Cast<TAttribute>(); } } internal class TerminalAppAuthorizationHandler : AttributeAuthorizationHandler<TerminalAppAuthorizationRequirement,TerminalAppAttribute> { protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, TerminalAppAuthorizationRequirement requirement, IEnumerable<TerminalAppAttribute> attributes) { object errorMsg = string.Empty; //如果取不到身份验证信息,并且不允许匿名访问,则返回未验证403 if (context.Resource is AuthorizationFilterContext filterContext && filterContext.ActionDescriptor is ControllerActionDescriptor descriptor) { //先判断是否是匿名访问, if (descriptor != null) { var actionAttributes = descriptor.MethodInfo.GetCustomAttributes(inherit: true); bool isAnonymous = actionAttributes.Any(a => a is AllowAnonymousAttribute); //非匿名的方法,链接中添加accesstoken值 if (isAnonymous) { context.Succeed(requirement); return Task.CompletedTask; } else { //url获取access_token //从AuthorizationHandlerContext转成HttpContext,以便取出表求信息 var sv12.ato.com/api/sys/user/postnew"; Dictionary<string, string> headerDic2 = new Dictionary<string, string> { { "appid", MainFramework.CloudAppID }, { "access_token", accessToken } }; string pushRst = OPWeb.Post(postURL, headerDic2, "POST", sYS_Users); if (string.IsNullOrEmpty(pushRst)) { MyMsg.Information("推送成功!"); } else { MyMsg.Information("推送失败!", pushRst); }
string accessToken = MainFramework.CloudAccessToken; if (accessToken.IndexOf("ERROR:") >= 0) { MyMsg.Information("获取Token出错:" + accessToken); return; }
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对易盾网络的支持。
本文共计814个文字,预计阅读时间需要4分钟。
前言:家都知道,在应用中,有时我们需要对访问的客户端进行有效性验证。只有提供有效凭证(如AccessToken)的终端应用才能访问我们的受控站点(如WebAPI站点)。此时,我们可以通过验证属性来确认。
前言
大家都知道在应用中,有时我们需要对访问的客户端进行有效性验证,只有提供有效凭证(AccessToken)的终端应用能访问我们的受控站点(如WebAPI站点),此时我们可以通过验证属性的方法来解决。
本文将详细介绍ASP.NET Core使用自定义验证属性控制访问权限的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧
方法如下
一、public class Startup的配置:
//启用跨域访问(不同端口也是跨域) services.AddCors(options => { options.AddPolicy("AllowOriginOtherBis", builder => builder.WithOrigins("1.16.9.12:4432", "pc12.ato.biz:4432", "localhost:44384", "1.16.9.12:4432", "pc12.ato.biz:4432").AllowAnyMethod().AllowAnyHeader()); }); //启用自定义属性以便对控制器或Action进行[TerminalApp()]定义。 services.AddSingleton<IAuthorizationHandler, TerminalAppAuthorizationHandler>(); services.AddAuthorization(options => { options.AddPolicy("TerminalApp", policyBuilder => { policyBuilder.Requirements.Add(new TerminalAppAuthorizationRequirement()); }); });
二、public void Configure(IApplicationBuilder app, IHostingEnvironment env)中的配置:
app.UseHttpsRedirection(); //使用Https传输 app.UseCors("AllowOriginOtherBis"); //根据定义启用跨域设置
三、示例WebApi项目结构:
四、主要代码(我采用的从数据库进行验证):
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)] internal class TerminalAppAttribute : AuthorizeAttribute { public string AppID { get; } /// <summary> /// 指定客户端访问API /// </summary> /// <param name="appID"></param> public TerminalAppAttribute(string appID="") : base("TerminalApp") { AppID = appID; } }
public abstract class AttributeAuthorizationHandler<TRequirement, TAttribute> : AuthorizationHandler<TRequirement> where TRequirement : IAuthorizationRequirement where TAttribute : Attribute { protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, TRequirement requirement) { var attributes = new List<TAttribute>(); if ((context.Resource as AuthorizationFilterContext)?.ActionDescriptor is ControllerActionDescriptor action) { attributes.AddRange(GetAttributes(action.ControllerTypeInfo.UnderlyingSystemType)); attributes.AddRange(GetAttributes(action.MethodInfo)); } return HandleRequirementAsync(context, requirement, attributes); } protected abstract Task HandleRequirementAsync(AuthorizationHandlerContext context, TRequirement requirement, IEnumerable<TAttribute> attributes); private static IEnumerable<TAttribute> GetAttributes(MemberInfo memberInfo) { return memberInfo.GetCustomAttributes(typeof(TAttribute), false).Cast<TAttribute>(); } } internal class TerminalAppAuthorizationHandler : AttributeAuthorizationHandler<TerminalAppAuthorizationRequirement,TerminalAppAttribute> { protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, TerminalAppAuthorizationRequirement requirement, IEnumerable<TerminalAppAttribute> attributes) { object errorMsg = string.Empty; //如果取不到身份验证信息,并且不允许匿名访问,则返回未验证403 if (context.Resource is AuthorizationFilterContext filterContext && filterContext.ActionDescriptor is ControllerActionDescriptor descriptor) { //先判断是否是匿名访问, if (descriptor != null) { var actionAttributes = descriptor.MethodInfo.GetCustomAttributes(inherit: true); bool isAnonymous = actionAttributes.Any(a => a is AllowAnonymousAttribute); //非匿名的方法,链接中添加accesstoken值 if (isAnonymous) { context.Succeed(requirement); return Task.CompletedTask; } else { //url获取access_token //从AuthorizationHandlerContext转成HttpContext,以便取出表求信息 var sv12.ato.com/api/sys/user/postnew"; Dictionary<string, string> headerDic2 = new Dictionary<string, string> { { "appid", MainFramework.CloudAppID }, { "access_token", accessToken } }; string pushRst = OPWeb.Post(postURL, headerDic2, "POST", sYS_Users); if (string.IsNullOrEmpty(pushRst)) { MyMsg.Information("推送成功!"); } else { MyMsg.Information("推送失败!", pushRst); }
string accessToken = MainFramework.CloudAccessToken; if (accessToken.IndexOf("ERROR:") >= 0) { MyMsg.Information("获取Token出错:" + accessToken); return; }
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对易盾网络的支持。

