我正在尝试使用Asp Mvc 4 / Web Api和angularjs开发单页应用程序。
我正在使用mvc控制器操作来返回视图和web api操作以返回json。
由于web api部分是restfull并且没有状态,我想知道如何检查用户会话是否已过期。例如:用户点击按钮,这会导致请求web api操作获取一些json数据。但是当请求到达服务器时,我想检查用户会话是否已过期。
正如我所说,我对这种技术组合并不陌生,我想知道如何实现这一目标。任何例子将不胜感激。提前谢谢。
答案 0 :(得分:0)
Web API引入了一个属性[Authorize]
来提供安全性。这可以全局设置(global.asx)
public static void Register(HttpConfiguration config)
{
config.Filters.Add(new AuthorizeAttribute());
}
或者每个控制器:
[Authorize]
public class ValuesController : ApiController{
...
如果您的用户已通过身份验证(会话未过期),则在未返回http 401 unauthorized
的情况下,该服务将正常运行。
答案 1 :(得分:0)
这就是我在项目中的做法:首先在MVC应用程序中实例化客户端上的会话,如果用户登录,一旦创建会话,每次请求都应该添加唯一的可识别令牌或会话您要发送的WebApi请求标头中的id,如果用户在未登录的情况下发送请求,则请求标头中不会出现令牌。 如果在您的服务中您获得了可以验证的身份验证令牌,则表示请求已经过身份验证,因此会话仍然存在,否则用户在没有会话的情况下发送请求,因此请求的标头中不存在令牌。
您可以像这样添加标题:
HttpClient httpClient = new HttpClient();
// Add a new Request Message
HttpRequestMessage requestMessage = new HttpRequestMessage(...);
// Add your custom headers
requestMessage.Headers.Add("authToken", "SessionId");
or
requestMessage.Headers.Add("authToken", "encryptedUsername:encryptedPassword");
然后在您的WebApi服务中读取这些标题,如果您可以唯一标识或验证authToken,那么这意味着会话就位,其他未经身份验证的请求,生成错误响应。
我不知道这是不是最好的做法,但我是这样做的。我实际上存储了加密的用户名&在我的会话中使用密码并将其附加到每个请求中,在我的WebApi中,我提取这些标头值并使用我的数据库重新检查它们,然后进一步处理请求。我知道很多人不会对在会话中存储密码感到高兴,但我认为它并不是那么糟糕,它们至少是加密形式。休息是由你决定的,你可以存储一个sessionId或一个唯一的标识符或一个标志,可能表明会话实际到位并且请求已经过身份验证。