【发布时间】:2015-02-28 22:37:45
【问题描述】:
在遵循 this 教程(修改它以使用基于应用程序的身份验证字符串而不是其用户模型)中,定义以下 TokenValidationAttribute 并在 WebAPI 控制器上设置此属性以验证 API 请求是否到来在我的网络应用程序中:
public class TokenValidationAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
string token;
try
{
token = actionContext.Request.Headers.GetValues("Authorization-Token").First();
}
catch (Exception)
{
actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.BadRequest)
{
Content = new StringContent("Missing Authorization-Token")
};
return;
}
try
{
var crypto = new SimpleCrypto.PBKDF2(); // type of encryption
var authPart = ConfigurationManager.AppSettings["AuthorizationTokenPart"];
var authSalt = GlobalVariables.AuthorizationSalt;
var authToken = GlobalVariables.AuthorizationToken;
if (authToken == crypto.Compute(authPart, authSalt))
{
// valid auth token
}
else
{
// invalid auth token
}
//AuthorizedUserRepository.GetUsers().First(x => x.Name == RSAClass.Decrypt(token));
base.OnActionExecuting(actionContext);
}
catch (Exception ex)
{
actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Forbidden)
{
Content = new StringContent("Unauthorized User")
};
return;
}
}
}
在我的登录类中,我定义了以下方法,如果有效则返回 User 对象:
private User IsValid(string username, string password)
{
var crypto = new SimpleCrypto.PBKDF2(); // type of encryption
using (var db = new DAL.DbContext())
{
var user = db.Users
.Include("MembershipType")
.FirstOrDefault(u => u.UserName == username);
if (user != null && user.Password == crypto.Compute(password, user.PasswordSalt))
{
return user;
}
}
return null;
}
如您所见,用户登录验证方法不会对 ~/api/User 进行 WebAPI 调用(该部分有效)。
1) 如何使用身份验证令牌生成请求(仅站点生成的 API 请求有效)?这些可能是来自代码隐藏的直接 API 调用,或者是基于 JavaScript (AngularJS) 的请求来水合某些对象。
2) 我不太清楚 base.OnActionExecuting(actionContext); 是什么。令牌有效/无效怎么办?
【问题讨论】:
标签: asp.net-mvc-4 angularjs asp.net-web-api