保护 MVC4 c# webapi,以便只有我的应用程序可以访问它
Posted
技术标签:
【中文标题】保护 MVC4 c# webapi,以便只有我的应用程序可以访问它【英文标题】:Secure MVC4 c# webapi so that only my app can access it 【发布时间】:2013-01-11 13:21:39 【问题描述】:我在这里阅读了一些帖子,但似乎找不到合适的答案,希望有人能提供帮助。
我看到你可以添加
[认证]
归因于 mvc 控制器。这在人们可以登录的网站情况下是合理的,但我有一个与 Web 服务通信的 ios 应用程序。我想限制对我的应用程序的访问。
我认为需要的“步骤”是:
-
为所有 webapi 操作添加某种“[authenticate]”属性(甚至在全局级别上更好)
为 Web 服务创建某种 ssl 证书
添加某种身份验证方法并将凭据硬编码到应用代码中
如何利用 mvc 框架来完成这个或类似的工作?
(PS:看过this这样的帖子,但是把这个逻辑加到每一个代码动作中是非常不切实际的,我会创造什么样的“挑战”??)
【问题讨论】:
您的步骤正确。你在这里的意义是什么,你面临什么问题? 我的问题是这实际上是如何完成的,而不是想法:) 如何添加这些身份验证属性,如何确保传递给服务器的密码是安全的等等 你可以参考这个答案:***.com/questions/11775594/…使用HMAC认证 【参考方案1】:您可以通过一些简单的方法向您的 Web 服务验证自己,并且您不必使用任何花哨的东西,甚至不必遵循 OAuth 或 OpenID 之类的标准(并不是说这些不好,但听起来您想要用一些简单的东西让你的脚进门)。
您需要做的第一件事是学习如何从AuthorizeAttribute
派生(System.Web.Http 命名空间中的一个,而不是 MVC 的那个)。您覆盖OnAuthorization
函数并将您的身份验证逻辑放在那里。看到这个寻求帮助,MVC Api Action & System.Web.Http.AuthorizeAttribute - How to get post parameters?
接下来决定您要如何进行身份验证。在最基本的形式中,您可以执行一些操作,例如为每个名为 MyID: [SomeRandomString]
的 Web 请求添加标头。然后在 OnAuthorization
方法中检查请求的标头,如果它不是正确的字符串,则将响应状态代码设置为 401(未授权)。
如果您的服务是自托管的,那么您可以将证书绑定到它托管的端口并使用 https:// 前缀,您现在已经保护了传输层,因此人们无法看到您传递的 ID/密码.如果您在 IIS 中托管,则可以通过它绑定证书。这很重要,因为通过普通 HTTP 传递密码之类的东西并不安全。
创建自定义 AuthorizeAttribute
public class PasswordAuthorizeAttribute : System.Web.Http.AuthorizeAttribute
public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
try
string password = actionContext.Request.Headers.GetValues("Password").First();
// instead of hard coding the password you can store it in a config file, database, etc.
if (password != "abc123")
// password is not correct, return 401 (Unauthorized)
actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized);
return;
catch (Exception e)
// if any errors occur, or the Password Header is not present we cannot trust the user
// log the error and return 401 again
actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized);
return;
[PasswordAuthorize]
public class YourController : ApiController
生成自签名证书
生成自签名证书的最简单方法是打开 IIS,单击服务器证书,然后如图所示“生成自签名证书”http://www.sslshopper.com/article-how-to-create-a-self-signed-certificate-in-iis-7.html
将证书绑定到端口
http://msdn.microsoft.com/en-us/library/ms733791.aspx
netsh http add sslcert ipport=0.0.0.0:8000 certhash=0000000000003ed9cd0c315bbb6dc1c08da5e6 appid=00112233-4455-6677-8899-AABBCCDDEEFF
这里有一个很棒的教程,介绍如何通过 https 自行托管 Web api 服务,http://pfelix.wordpress.com/2012/02/26/enabling-https-with-self-hosted-asp-net-web-api/
【讨论】:
感谢您的回答,您能否指导我使用一些资源来生成这些证书并将它们绑定到请求? 当然,这是您使用 netsh 实用程序调用的单行程序(对于 XP 等较旧的操作系统,您使用 httpcfg)。您需要先将证书及其私钥添加到您的证书存储中。我已经附加了 cmd 和一些对我的回答有用的附加参考。 谢谢!最后一个小问题,我怎样才能添加某种密码并确保 IIS 会丢弃所有没有密码的请求? (我的意思是添加某种全局“检查来自 https 的每个请求在请求中都有这个密码:myapi.com/mymethod?pw=123456) 我已经用一个更好的例子更新了我的答案,说明如何覆盖自定义密码检查的授权属性。 IIS 不会丢弃请求,但会向用户返回 401,以防他们无法进行身份验证。以上是关于保护 MVC4 c# webapi,以便只有我的应用程序可以访问它的主要内容,如果未能解决你的问题,请参考以下文章