移动客户端的asp.net Web Api自定义身份验证要求

Posted

技术标签:

【中文标题】移动客户端的asp.net Web Api自定义身份验证要求【英文标题】:asp.net Web Api custom authentication requirement for mobile client 【发布时间】:2012-04-21 02:18:42 【问题描述】:

请根据以下要求提供您对我的解决方案的反馈。

要求(类似):

1.a 假设身份验证令牌由电子邮件和日期组成并被加密

1.b authentication Token通过header发回给客户端

1.c authentication Token存储在客户端和服务器上

我的解决方案:

1) 通过 header 将 authentication Token 发送回客户端。我使用了 cookie 和以下代码。

  HttpCookie cookie = new HttpCookie("AuthenticationToken");
      cookie.Value = "EncryptedToken";
      Response.Cookies.Add(cookie);

2) 我会将身份验证令牌存储在数据库中,并且对于每个请求,我都会将保存在 cookie 中的令牌与存储在数据库中的令牌进行比较。 (假设加密、解密操作正确完成)

您的反馈/意见?

【问题讨论】:

Cookies 适用于网络浏览器,但如果您还希望针对移动和桌面客户端,您可能需要考虑其他内容 你是对的。我最终使用了 sqllite,并通过 http 标头发送身份验证令牌。 【参考方案1】:

我没有安全方面的专业知识。对我来说,你的想法听起来可行。

但是,我很好奇您为什么要像这样进行“自定义” 身份验证? 您是否看过“build it”在 Web.API 中完成的 ASP.NET 身份验证?

然后你可以create a custom HttpOperationHandler 使用标准的 .net 东西,比如:

var ticket = FormsAuthentication.Decrypt(val);
var ident = new FormsIdentity(ticket);
...
var principle = new GenericPrincipal(identity, new string[0]);
Thread.CurrentPrincipal = principle;
...
if (!principal.Identity.IsAuthenticated)
    return false;

另外,您可能想了解Thread.CurrentPrincipal and Current.User

优点是您不需要将身份验证令牌存储在服务器上的某个数据库中并在每次请求时检索它。

【讨论】:

在 Restful 中你不能使用 ASP.NET Membership API 这是一个非常有效的解决方案。你可以通过 AuthorizationFilterAttribute 来做到这一点。【参考方案2】:

在我看来还不错。但是,如果您正在加密(因此您可以解密)并且可以找到电子邮件(识别用户)和发出的时间令牌(因此验证是否过期),您还需要将其存储在数据库中吗?我会的,前提是我有其他要求,例如跟踪等。

【讨论】:

我将它存储在数据库中,否则我如何在不同的请求中跟踪用户。 例如,第一次获取用户请求,下一个请求是发布...所以基本上我正在为每个请求验证用户...我希望我已经解释过了。

以上是关于移动客户端的asp.net Web Api自定义身份验证要求的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Web API 简介

Asp.Net Mvc WebSocket - 客户端的自定义参数

ASP.NET web api汇总

ASP.NET Web API 身份验证(Web + 移动)

ASP.NET Web Api 路由自定义

asp.net web api添加自定义认证