2023年6月20日发(作者:)
e中使⽤⾃定义验证属性控制访问权限在应⽤中,有时我们需要对访问的客户端进⾏有效性验证,只有提供有效凭证(AccessToken)的终端应⽤能访问我们的受控站点(如WebAPI站点),此时我们可以通过验证属性的⽅法来解决。⼀、public class Startup的配置://启⽤跨域访问(不同端⼝也是跨域)s(options =>{icy("AllowOriginOtherBis",builder => igins("1.16.9.12:4432", ":4432", "localhost:44384", "1.16.9.12:4432",":4432").AllowAnyMethod().AllowAnyHeader());});//启⽤⾃定义属性以便对控制器或Action进⾏[TerminalApp()]定义。gleton
{ //任意⼀个在数据库列表中的App都可以运⾏,否则先判断提交的APPID与需要ID是否相符 bool mat = false; foreach (var terminalAppAttribute in attributes) { if ( == requestAppID) { mat = true; break; } } if (!mat) { errorMsg = horize("客户端应⽤未在服务端登记或未被授权运⽤当前功能."); return HandleBlockedAsync(context, requirement, errorMsg); } } } //如果未指定attributes,则表⽰任何⼀个终端服务都可以调⽤服务, 在验证区域验证终端提供的ID是否匹配数据库记录 string valRst = ValidateToken(requestAppID, requestAccessToken); if (OrEmpty(valRst)) { d(requirement); return tedTask; } else { errorMsg = horize("AccessToken验证失败(" + valRst + ")","91"); return HandleBlockedAsync(context, requirement, errorMsg); } } else { errorMsg = horize("未提供AppID或Token.");
return HandleBlockedAsync(context, requirement, errorMsg); //return tedTask; } } } } else { errorMsg = horize("FilterContext类型不匹配."); return HandleBlockedAsync(context, requirement, errorMsg); } errorMsg = horize("未知错误."); return HandleBlockedAsync(context,requirement, errorMsg); } //校验票据(数据库数据匹配) ///
} string tmpToken = ; tmpToken = ode(accessToken);//解码相应的Token到原始字符(因其中可能会有+=等特殊字符,必须编码后传递) tmpToken = 16Decrypt(tmpToken, appKeyOnServer); //使⽤APPKEY解密并分析 if (OrEmpty(tmpToken)) { return "客户端提交的⾝份令牌运算为空!"; } else { try { //原始验证码为im_cloud_sv001-appid-ticks格式 //取出时间,与服务器时间对⽐,超过10秒即拒绝服务 long tmpTime =64(ing(dexOf("-")+1)); //DateTime dt = xact(tmpTime, "yyyyMMddHHmmss", tCulture); DateTime dt= new DateTime(tmpTime); bool IsInTimeSpan = (le(ffSeconds(dt, )) <= 7200); bool IsInternalApp = (f("im_cloud_sv001-") >= 0); if (!IsInternalApp || !IsInTimeSpan) { return "令牌未被许可或已经失效!"; } else { return ; //成功验证 } } catch (Exception ex) { return "令牌解析出错(" + e + ")"; } } } catch (Exception ex) { return "令牌解析出错(" + e + ")"; } } private Task HandleBlockedAsync(AuthorizationHandlerContext context, TerminalAppAuthorizationRequirement requirement, object errorMsg) { var authorizationFilterContext = ce as AuthorizationFilterContext; = new JsonResult(errorMsg) { StatusCode = 202 }; //设置为403会显⽰不了⾃定义信息,改为Accepted202,由客户端处理 d(requirement); return tedTask; } } internal class TerminalAppAuthorizationRequirement : IAuthorizationRequirement { public TerminalAppAuthorizationRequirement() { } }五、相应的Token验证代码: [AutoValidateAntiforgeryToken] //在本控制器内⾃动启⽤跨站攻击防护 [Route("api/get_accesstoken")] public class GetAccessTokenController : Controller { //尚未限制访问频率 //返回{"access_token":"ACCESS_TOKEN","expires_in":7200} 有效期2个⼩时 //错误时返回{"errcode":40013,"errmsg":"invalid appid"} [AllowAnonymous] public ActionResult
public class UserController : Controller{//} 七、⼀个CS客户端通过Web API上传数据调⽤⽰例: string postURL = "/api/sys/user/postnew"; Dictionary
2023年6月20日发(作者:)
e中使⽤⾃定义验证属性控制访问权限在应⽤中,有时我们需要对访问的客户端进⾏有效性验证,只有提供有效凭证(AccessToken)的终端应⽤能访问我们的受控站点(如WebAPI站点),此时我们可以通过验证属性的⽅法来解决。⼀、public class Startup的配置://启⽤跨域访问(不同端⼝也是跨域)s(options =>{icy("AllowOriginOtherBis",builder => igins("1.16.9.12:4432", ":4432", "localhost:44384", "1.16.9.12:4432",":4432").AllowAnyMethod().AllowAnyHeader());});//启⽤⾃定义属性以便对控制器或Action进⾏[TerminalApp()]定义。gleton
{ //任意⼀个在数据库列表中的App都可以运⾏,否则先判断提交的APPID与需要ID是否相符 bool mat = false; foreach (var terminalAppAttribute in attributes) { if ( == requestAppID) { mat = true; break; } } if (!mat) { errorMsg = horize("客户端应⽤未在服务端登记或未被授权运⽤当前功能."); return HandleBlockedAsync(context, requirement, errorMsg); } } } //如果未指定attributes,则表⽰任何⼀个终端服务都可以调⽤服务, 在验证区域验证终端提供的ID是否匹配数据库记录 string valRst = ValidateToken(requestAppID, requestAccessToken); if (OrEmpty(valRst)) { d(requirement); return tedTask; } else { errorMsg = horize("AccessToken验证失败(" + valRst + ")","91"); return HandleBlockedAsync(context, requirement, errorMsg); } } else { errorMsg = horize("未提供AppID或Token.");
return HandleBlockedAsync(context, requirement, errorMsg); //return tedTask; } } } } else { errorMsg = horize("FilterContext类型不匹配."); return HandleBlockedAsync(context, requirement, errorMsg); } errorMsg = horize("未知错误."); return HandleBlockedAsync(context,requirement, errorMsg); } //校验票据(数据库数据匹配) ///
} string tmpToken = ; tmpToken = ode(accessToken);//解码相应的Token到原始字符(因其中可能会有+=等特殊字符,必须编码后传递) tmpToken = 16Decrypt(tmpToken, appKeyOnServer); //使⽤APPKEY解密并分析 if (OrEmpty(tmpToken)) { return "客户端提交的⾝份令牌运算为空!"; } else { try { //原始验证码为im_cloud_sv001-appid-ticks格式 //取出时间,与服务器时间对⽐,超过10秒即拒绝服务 long tmpTime =64(ing(dexOf("-")+1)); //DateTime dt = xact(tmpTime, "yyyyMMddHHmmss", tCulture); DateTime dt= new DateTime(tmpTime); bool IsInTimeSpan = (le(ffSeconds(dt, )) <= 7200); bool IsInternalApp = (f("im_cloud_sv001-") >= 0); if (!IsInternalApp || !IsInTimeSpan) { return "令牌未被许可或已经失效!"; } else { return ; //成功验证 } } catch (Exception ex) { return "令牌解析出错(" + e + ")"; } } } catch (Exception ex) { return "令牌解析出错(" + e + ")"; } } private Task HandleBlockedAsync(AuthorizationHandlerContext context, TerminalAppAuthorizationRequirement requirement, object errorMsg) { var authorizationFilterContext = ce as AuthorizationFilterContext; = new JsonResult(errorMsg) { StatusCode = 202 }; //设置为403会显⽰不了⾃定义信息,改为Accepted202,由客户端处理 d(requirement); return tedTask; } } internal class TerminalAppAuthorizationRequirement : IAuthorizationRequirement { public TerminalAppAuthorizationRequirement() { } }五、相应的Token验证代码: [AutoValidateAntiforgeryToken] //在本控制器内⾃动启⽤跨站攻击防护 [Route("api/get_accesstoken")] public class GetAccessTokenController : Controller { //尚未限制访问频率 //返回{"access_token":"ACCESS_TOKEN","expires_in":7200} 有效期2个⼩时 //错误时返回{"errcode":40013,"errmsg":"invalid appid"} [AllowAnonymous] public ActionResult
public class UserController : Controller{//} 七、⼀个CS客户端通过Web API上传数据调⽤⽰例: string postURL = "/api/sys/user/postnew"; Dictionary
发布评论