我有一个MVC 5 asp.net网站,我需要向独立的移动客户端公开一些REST API。该网站的其余部分使用基于表单的安全性,它将ASP.NET_SessionId设置为cookie,并用于在用户登录后通过请求对用户进行身份验证。使用我的移动应用程序,我无法使用cookie方法因为跨多曼问题。我想要做的是添加标题“X-SessionId”与ASP.NET_SessionId的值,然后在服务器端,有一个查找该字段的过滤器,如果它存在,将请求与给定的会话。 (客户端将使用AJAX POST调用登录,该调用将在成功登录后返回ASP.NET_SessionId。)
这可能吗?
答案 0 :(得分:0)
这样的东西?
public sealed class CustomSecurityAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext == null)
throw new ArgumentNullException("filterContext");
if (string.IsNullOrEmpty(filterContext.HttpContext.Request.Headers["X-SessionId"]) && IsAuthenticated(ilterContext.HttpContext.Request.Headers["X-SessionId"]))
filterContext.Result = new HttpNotFoundResult();
}
private bool IsAuthenticated(string sessionId)
{
// get your user details from your database (or whatever)
var user = new UserRepository().Get(sessionId);
if (user == null)
return false;
// build up an identity, use your own or out of the box.
FormsIdentity itentity = new MyIdentity(user);
// Set the user
filterContext.HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(itentity , user.Roles);
return true;
}
}
您将不得不在数据库中存储当前会话,例如,当用户登录时抓取sessionid并将其粘贴到数据库中,因此您知道他们有1..n个当前会话。
然后您可以将其作为身份验证的一部分进行查找。
修改强>
让我们退后一步,暂时不要介意cookie和会话。
你有一个网站和一个安静的api,他们都服务于不同的目的和客户,并有不同的安全要求。
那么保护Api最常见的选择是什么?
基本身份验证。
大多数restful API都需要在每个请求中发送用户名/密码,作为标题的一部分或在请求本身中发送。
身份验证令牌
当您检查令牌时,您可以提供与用户帐户关联的令牌(guid就足够了)。
使用OAuth
我建议您使用这些常见方案,以确保您不会遗漏任何内容,并打开自己的安全漏洞。
是否有理由不能使用其中任何一种?