a.授权配置
a1.命名空间引用
- System.Web.Http
- System.Web.Http.Controllers
- System.Web.Security
a2.身份认证授权配置
public class CommonBasicAuthorize: AuthorizeAttribute
{
public override void OnAuthorization(HttpActionContext actionContext)
{
var userAuthorization = actionContext.Request.Headers.Authorization;
if (userAuthorization != null && userAuthorization.Parameter != null)
{
if (CheckTicket(userAuthorization.Parameter))
base.IsAuthorized(actionContext);
else
HandleUnauthorizedRequest(actionContext);
}
else
{
var attributeList = actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().OfType<AllowAnonymousAttribute>();
bool allowAnonymous = attributeList.Any(attribute => attribute is AllowAnonymousAttribute);
if (allowAnonymous)
base.OnAuthorization(actionContext);
else
HandleUnauthorizedRequest(actionContext);
}
}
private bool CheckTicket(string ticket)
{
var userData = FormsAuthentication.Decrypt(ticket).UserData;
int p = userData.IndexOf("&");
string userName = userData.Substring(0, p);
string userPwd = userData.Substring(p + 1);
return true;
}
}
b.获取授权
b1.用户登陆,返回ticket接口
public class LoginController : ApiController
{
[AllowAnonymous]
[HttpPost]
public object UserLogin()
{
object encryptTicket = new { };
try
{
HttpContextBase context = (HttpContextBase)Request.Properties["MS_HttpContext"];
HttpRequestBase request = context.Request;
string UserCode = request["UserCode"].ToString();
FormsAuthenticationTicket userTicket = new FormsAuthenticationTicket(0, "UserName", DateTime.Now, DateTime.Now.AddHours(1), true, string.Format("{0}&{1}", "UserName", "UserPwd"), FormsAuthentication.FormsCookiePath);
encryptTicket = new { Success = true, Ticket = FormsAuthentication.Encrypt(userTicket), Msg = "获取成功" };
}
catch (Exception)
{
encryptTicket = new { Success = false, Msg = "出现异常" };
}
return encryptTicket;
}
}
b2.前端请求ticket
$.ajax({
url: "/api/Login/UserLogin",
type: "post",
data: {
UserCode: "620915"
},
success: function (data) {
if (data.Success == true) {
userTicket = data.Ticket;
}
}
});
c.携带ticket,请求数据
c1.需要授权认证的数据接口
[CommonBasicAuthorize]
public class StudentController : ApiController
{
[HttpPost]
public object GetSearchStudentData()
{
object json = new { };
try
{
HttpContextBase context = (HttpContextBase)Request.Properties["MS_HttpContext"];
HttpRequestBase request = context.Request;
int UserCode = int.Parse(request["UserCode"].ToString());
DataTable dt = CreateStudent_Dt();
for (int i = 0; i < 10; i++)
{
DataRow dataRow = dt.NewRow();
dataRow["Stu_ID"] = i + 1;
dataRow["UserCode"] = UserCode;
dataRow["Stu_Name"] = "张三";
dataRow["Stu_Age"] = 18 + i;
dt.Rows.Add(dataRow);
}
json = new { Success = true, data = dt, Msg = "查询成功" };
}
catch (Exception)
{
json = new { Success = false, Msg = "出现异常" };
}
return json;
}
public DataTable CreateStudent_Dt()
{
using (DataTable dt = new DataTable())
{
dt.Columns.Add("Stu_ID", typeof(int));
dt.Columns.Add("UserCode", typeof(int));
dt.Columns.Add("Stu_Name", typeof(string));
dt.Columns.Add("Stu_Age", typeof(string));
return dt;
}
}
}
c2.请求数据
$.ajax({
url: "/api/Student/GetSearchStudentData",
type: "post",
data: {
UserCode: "620915"
},
beforeSend: function (xmlHttpRequest) {
xmlHttpRequest.setRequestHeader("Authorization", "BasicAuthorize " + userTicket);
},
success: function (Result) {
console.log(Result);
},
error: function (XHR) {
var status = JSON.stringify(XHR.status);
if (status == 400) {
alert("错误请求,如语法错误");
} else if (status == 401) {
alert("请求授权失败");
} else if (status == 403) {
alert("请求不允许");
} else if (status == 404) {
alert("没有发现文件、查询或URL");
} else if (status == 500) {
alert("服务器产生内部错误");
} else {
alert("出现异常:" + JSON.stringify(XHR));
}
}
});
c3.注意
- [CommonBasicAuthorize] 声明控制器需要携带身份认证才能正常访问
- [AllowAnonymous] 声明当前接口可以跳过身份验证直接访问接口(匿名验证)