【问题标题】:check if user session has expired asp web api检查用户会话是否已过期 asp web api
【发布时间】:2014-06-01 22:38:18
【问题描述】:

我正在尝试使用 Asp Mvc 4 / Web Api 和 angularjs 开发单页应用程序。

我使用 mvc 控制器动作返回视图,使用 web api 动作返回 json。

由于 web api 部分是 restfull 并且它没有状态,我想知道如何检查用户会话是否已过期。例如:用户正在单击一个按钮,这会导致请求 web api 操作以获取一些 json 数据。但是当请求到达服务器时,我想检查用户会话是否已过期。

正如我所说,我对这种技术组合相当陌生,我想知道如何实现这一点。任何示例将不胜感激。提前致谢。

【问题讨论】:

标签: asp.net-mvc angularjs asp.net-web-api


【解决方案1】:

Web API 引入了属性[Authorize] 以提供安全性。这可以全局设置(global.asx)

public static void Register(HttpConfiguration config)
{
    config.Filters.Add(new AuthorizeAttribute());
}

或每个控制器:

[Authorize]
public class ValuesController : ApiController{
...

如果您的用户已通过身份验证(会话未过期),如果未返回 http 401 unauthorized,则服务将正常工作。

【讨论】:

    【解决方案2】:

    这就是我在项目中的做法:首先在客户端实例化一个会话id 在您要发送的 WebApi 请求的标头中,如果用户在未登录的情况下发送请求,则请求标头中将不存在令牌。 如果在您的服务中获得可以验证的身份验证令牌,则意味着请求已通过身份验证,因此会话仍然存在,否则用户在没有会话到位的情况下发送请求,因此请求标头中不存在令牌。

    您可以像这样在请求中添加标题:

    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 或一个唯一标识符或一个标志,这可能表明会话实际到位并且请求已通过身份验证。

    【讨论】:

    • 是的,在我的 WebApi 中,我有一个 [CustomAuthorize] 属性,就像我提取标题并从数据库中检查它一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    • 2018-04-10
    • 1970-01-01
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多