Owin中GrantResourceOwnerCredentials传递自定义参数的技术问询
解决Owin Token Auth中传递自定义参数到GrantResourceOwnerCredentials的问题
嘿,这个问题我刚好折腾过,其实操作起来很简单,分前端传参和后端接收两步走就搞定了:
第一步:前端AJAX请求中添加自定义参数
在你原来的POST请求的data对象里,直接追加你需要的自定义参数就行,参数名随便取(只要前后端保持一致):
$.ajax({ type: 'POST', url: Helper.ApiUrl() + '/token', data: { grant_type: 'password', username: UserName, password: Password, app_version: '1.0.0', // 示例自定义参数:APP版本号 device_type: 'web' // 示例自定义参数:设备类型 }, success: function (result) { // 你的成功处理逻辑 }, error: function (err) { // 错误处理 } });
第二步:后端在GrantResourceOwnerCredentials中获取自定义参数
Owin的OAuth中间件会把POST过来的表单数据解析到context.Request.Form集合里,不管是标准的OAuth参数还是你自定义的,都能从这里拿到。记得要做空值判断,避免空引用异常:
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) { // 获取默认的用户名和密码 var userName = context.UserName; var password = context.Password; // 获取自定义参数,用Get方法可以避免键不存在时抛出异常 var appVersion = context.Request.Form.Get("app_version"); var deviceType = context.Request.Form.Get("device_type"); // 验证自定义参数(如果有必要的话) if (string.IsNullOrEmpty(appVersion)) { context.SetError("invalid_request", "必须提供app_version参数"); return; } // 接下来就可以把这些自定义参数加入你的用户验证逻辑里了 // 比如根据设备类型做不同的验证规则,或者把版本信息记录到日志 // ... 你的用户验证逻辑代码 ... }
补充小提示
- 原理:OAuth的token端点默认接收
application/x-www-form-urlencoded格式的请求,所以所有表单参数都会被解析到Request.Form中,不管是不是OAuth标准定义的参数。 - 注意事项:自定义参数名要避开OAuth标准参数(比如
grant_type、scope这些),而且前后端参数名必须完全一致(大小写敏感哦)。
内容的提问来源于stack exchange,提问作者Victor Hugo Terceros
相关产品推荐
相关产品推荐

