所以一切正常,我只是不确定这是否是我应该这样做的方式。 这是更改当前送货地址的示例 已登录用户。
这是我制作的控制器:
[Route("addShippingAdress")]
[HttpPut]
public void addAddress([FromBody] string newShippingAdress)
{
string userId = User.Identity.GetUserId();
db.Users.Find(userId).ShippingAdress = newShippingAdress;
db.SaveChanges();
}
这是用于更改送货地址的 Ajax 请求:
$.ajax({
url: 'addShippingAdress',
method: 'PUT',
contentType: 'application/json',
headers: {
'Authorization': 'Bearer '
+ sessionStorage.getItem("accessToken")
},
dataType: "text",
data: JSON.stringify("some new adress"),
success: function (data) {
},
error: function (data) {
}
});
这是我用来登录的 Ajax 请求:
$.ajax({
url: '/token',
method: 'POST',
contentType: 'application/json',
data: {
username: $('#txtUserName').val(),
password: $('#txtPassword').val(),
grant_type: 'password'
},
success: function (response) {
sessionStorage.setItem("accessToken", response.access_token);
sessionStorage.setItem("userName", response.userName);
window.location.href = "Data.html";
},
error: function (data) {
console.log(data)
}
});
所以更具体地说,将来当我想获取登录用户的一些属性,或者更改登录用户的一些属性,如我给你的示例中的送货地址时,这是我这样做的方式吗?我是否需要像这样为每个 Ajax 请求发送访问令牌:
...
headers: {
'Authorization': 'Bearer '
+ sessionStorage.getItem("accessToken")
},
...
对于我想用于登录用户的每个控制器,然后 查找登录用户,如下所示:
string userId = User.Identity.GetUserId();
var loggedInUser = db.Users.Find(userId);
loggedInUser... // some logic here
这是正确的方法吗?如果是这样,控制器在哪里读取我在 Ajax 请求标头中发送的访问令牌?当我在正文中发送送货地址时,控制器可以在 [FromBody] 属性的帮助下读取它,如下所示:
public void addAddress([FromBody] string newShippingAdress)
但是它在哪里读取我在标头中发送的访问令牌? 我是新手,所以请耐心和理解。有好的一天!
在 API 项目中,创建自定义身份验证筛选器,如下所示:
创建一个从System.Web.Http.Filters.AuthorizationFilterAttribute
类继承的类TokenAuthenticationFilterAttribute
。
重写OnAuthorization
方法,如下所示
public override void OnAuthorization(HttpActionContext actionContext)
{
// Read the authorization header from the request
var auth = actionContext.Request.Headers.Authorization;
if(auth != null && auth.Scheme.ToLower().Equals("bearer", StringComparison.InvariantCultureIgnoreCase))
{
// Validate the header value against database
// If validation fails, send appropriate response
actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized);
}
}
在操作方法或控制器上使用此筛选器,如下所示:
[Route("addShippingAdress")]
[HttpPut]
[TokenAuthenticationFilter]
public void addAddress([FromBody] string newShippingAdress)
{
string userId = User.Identity.GetUserId();
db.Users.Find(userId).ShippingAdress = newShippingAdress;
db.SaveChanges();
}