Microsoft MVC 4、APIController 和适当的 RESTful 登录 Web 服务
Posted
技术标签:
【中文标题】Microsoft MVC 4、APIController 和适当的 RESTful 登录 Web 服务【英文标题】:Microsoft MVC 4, APIController and a proper RESTful login Web Service 【发布时间】:2012-03-28 13:03:45 【问题描述】:我使用 Microsoft ASP.NET MVC 4 ApiController
制作了一个简单的 RESTful Web 服务(目前仅支持 GET)。
现在我正在寻找为服务实施授权系统的正确方法。我知道我不想使用内置的FormsAuthentication
,因为我不想让所有使用我的 WS 的应用程序都有一个唯一的登录页面;此外,这打破了 RESTful 范式,强制重定向并且不使用正确的401
状态代码通知客户端。
所以我禁用了FormsAuthentication
,从我的web.config
中删除以下行:
<authentication mode="Forms">
<forms loginUrl="~/Account/Login" timeout="2880" />
</authentication>
并添加以下内容:
<modules runAllManagedModulesForAllRequests="true">
<remove name="FormsAuthentication" />
</modules>
我已经有一个用于管理用户登录的ApiController
,它主要根据我的数据库检查凭据并返回用户,如果凭据无效则返回401
。
我读到我必须实现Membership
和Authorization
API,但我发现没有什么可以帮助我从头开始做。
你有什么想法?我是否需要管理数据库上的 cookie 和 authcode,或者是否有类似于 FormsAuthentication
的类来为我做这件事?
【问题讨论】:
【参考方案1】:您可以编写custom message handler 来处理身份验证。 Dominick Baier 写了一篇出色的 series of blog posts,其中深入探讨了细节。
【讨论】:
【参考方案2】:我找到了解决方案,我基本上只是使用了 Microsoft 的example 中显示的解决方法。
-
创建一个名为 App_Start 的文件夹。
将two classes 放入适当的命名空间。
FormsAuthentication 和添加的请求/响应处理系统将完成剩下的工作。
由于我不喜欢 401 响应中的“内容已移至此处”,因此我以这种方式编辑了 OnEndRequest
方法:
private void OnEndRequest(object source, EventArgs args)
var context = (HttpApplication)source;
var response = context.Response;
if (context.Context.Items.Contains("__WEBAPI:Authentication-Fixup"))
response.StatusCode = (int)context.Context.Items[FixupKey];
response.RedirectLocation = null;
// Clear the page content, since I don't want the "Content moved here." body
response.ClearContent();
参考资料:
http://netmvc.blogspot.it/2012/03/aspnet-mvc-4-webapi-authorization.html【讨论】:
【参考方案3】:查看此project on github。他们开发了一些带有示例的类,用于向 ASP.NET Web API 添加安全性。支持的安全模型之一是基本身份验证,这似乎是您在问题中描述的内容。
【讨论】:
看来我需要第一个示例,BasicAuthentication
。但是我还不知道是否有办法将授权码(我不会将用户名和密码作为授权码发送给客户端)存储在数据库中。
我不确定我是否理解您所说的“存储身份验证码的方法”是什么意思。您对授权码的描述是什么。使用基本身份验证,您希望对发送过来的用户名/密码进行编码,并在另一端对其进行解码。您还想使用带有基本身份验证的 HTTPS/SSL/TSL 来加密网络上的整个消息。在数据库中存储密码时,我总是对存储的密码使用一种加密方式。然后在比较数据库中的内容之前,对用户输入的密码使用相同的加密。
我想为每个登录创建一个临时验证码并将其存储在数据库中。我认为这与 FormsAuthentication 所做的相同:它创建了一个与登录用户严格链接的会话授权代码。
让我更好地解释一下:如果我下载 Microsoft 的 this sample project 并启动 Web 应用程序,在第一次注册时,它会自动创建一个包含用户数据的默认数据库。然后,当我登录时,Web 应用程序会设置一个名为 .ASPXAUTH 的 cookie,每次我注销时都会有所不同。这意味着服务器不会根据用户名和密码检查 cookie 值,而是根据存储的值。我想使用已有的 User 表来实现同样的目的。
我相信你描述的是令牌认证,我之前提到的库中也支持。在这篇文章中有一个很好的讨论,关于使用这种方法的注意事项 [***.com/questions/1432664/…。基本上,您需要为登录创建 Web 服务方法,该方法返回一个令牌(身份验证码)供客户端用于任何进一步的服务调用。使用此方法时,您确实需要在 authcode 中添加超时。以上是关于Microsoft MVC 4、APIController 和适当的 RESTful 登录 Web 服务的主要内容,如果未能解决你的问题,请参考以下文章
Microsoft MVC 4、APIController 和适当的 RESTful 登录 Web 服务
无法从 C:\ 创建分析器 Microsoft.AspNetCore.Mvc.Analyzers.AvoidHtmlPartialAnalyzer 的实例
从Microsoft.AspNet.Identity看微软推荐的一种MVC的分层架构
MVC4 未处理异常:Microsoft JScript 运行时错误
Azure Functions Swashbuckle:在重建期间无法解析程序集“Microsoft.AspNetCore.Mvc.Core”
尝试激活“Student.Controllers.MyController”时无法解析“Microsoft.AspNetCore.Mvc.ActionContext”类型的服务