大致说明一下,在controller上加了个简单的权限验证,如果权限不够,就跳转到其它url,但部分手机访问时会报如下错误,大致代码如下:
权限验证代码:
public class MyAuthorizeAttribute : AuthorizeAttribute
{
protected override bool IsAuthorized(HttpActionContext actionContext)
{
HttpContext.Current.Response.Redirect("~/api/Login/QM_Users/NotLogin", true);
return false;
}
}
调用权限验证代码
异常详情:
API在未授权的时候返回的应该是401等未授权Code, Redirect是前端页面的做法.
就好像你调用微信的接口一样,权限不够,并不会返回401,只会提示例如下面这样的消息{"Success":false,"ErrCode":1,"ErrMsg":"invalid code"}
@老牛在路上: 返回的设计上有两种方式,
1. 封包
2. 不封包,你上面贴出的是封包的方式,
这两种方式有一个明显的区别,就是是否含有success的属性,
封包: 每个消息返回的HttpCode都是200, 里面有Success标记是否成功,Message说明一些特别情况
不封包: 每个消息根据HttpCode确定返回是成功还是失败, 成功的时候按正常的解析,不成功的时候根据状态码解析错误信息.
@Flyear: 对,我就是在attrubite封装了,但好像 我用redirect就有问题了。
@老牛在路上: 在验证失败的时候,返回302做ReLocation本身就是不符合常规的做法,除非你有明确这个地址是要做302。
@Flyear: 嗯,那如果我想封包,不用跳转的话应该怎么做
@老牛在路上: 那就在封包里面加各ErrorCode, ErrorMessage, 客户端根据Code去判断要跳转到哪里.
@Flyear: 嗯,我的本意就是这样,我本来的思路是在attribute的IsAuthorized里做判断,然后把所有controller都加上这个特性,这样所有地址都会进行权限判断了,但我不知道在IsAuthorized应该怎么返回,所以才用了redirect
@Flyear:找到了HandleUnauthorizedRequest,应该可以了,谢谢各位。
API返回302是什么意思?
你会返回302?
@老牛在路上: 下面顾小北的说法是对的.
像这种接口你要定义一个约定.所有的api返回值都继承自result基类.
基类中包含错误信息,你在过滤器直接返回结果就可以了.webapi中是可以的.
既然是WebAPI,为什么要Redirect?
其实就是一个简单处理,判断不够权限就返回例如下面这样的消息{"Success":false,"ErrCode":1,"ErrMsg":"NotLogin"}
@老牛在路上: 那就返回就完了,为什么要跳转?直接return Json(new {"Success":false,"ErrCode":1,"ErrMsg":"NotLogin"});就行了。。。
这既然是API,你也不确定你的客户端是不是浏览器,你也不确定客户端调用是不是Ajax,你这个跳转是发送给客户端一个302的消息,你的客户端就确定可以处理302?
@顾晓北: 和你说的其实是一样的,只是由于我是在attribute里做的判断,所以不知道怎么直接return, 所以redirect跳转后的action里是一个 return new HttpResponseMessage {内容}
@老牛在路上:
JsonResult result = new JsonResult(); result.Data = new { State = "100", ErrorCode = "001", ErrorMessage = "MD5校验失败", Message = "验证失败" }; result.JsonRequestBehavior = JsonRequestBehavior.AllowGet; filterContext.Result = result; return;
这样试试呢?
@顾晓北: 谢谢,你这样在mvc里应该是可以的,但在webapi的attribute里好像不行,我看有没有别的办法。