使用ASP.NET Web API的跨平台身份validation

我怎样才能开始使用ASP.NET Web API进行编码authentication,以便跨平台支持桌面,移动和Web? 我读过一些做RESTfulauthentication的方法,比如在标头中使用标记。

那里有没有使用这种方法的示例项目?

问题:

  1. 如果不是我如何修复[Authorize]属性来读取令牌?
  2. 我如何生成这个令牌? 我不认为我可以使用formsauthentication,因为它使用cookie。
  3. 我如何处理实际授权,客户端发送原始密码和用户名,然后我生成的令牌或有其他的方式吗?
  4. 我的网站在使用时如何处理? 我听说这个处理与应用程序使用它的方式不同,比如获取域和授权。

我认为代币将是一个坚实的路要走。 表单身份validation基于networking的Cookie。 不是所有非浏览器客户端最想法的情况。

我build议创build一个自定义的AuthorizationFilterAttribute并重写OnAuthorization方法。 在这种方法中,您可以检查在提供有效凭证后发给客户端的令牌是否存在。 你可以在你想validation的任何方法或控制器上使用这个属性。 以下是您可能会参考的示例

  public class AuthorizeTokenAttribute : AuthorizationFilterAttribute { public override void OnAuthorization(HttpActionContext actionContext) { if (actionContext != null) { if (!AuthorizeRequest(actionContext.ControllerContext.Request)) { actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized) { RequestMessage = actionContext.ControllerContext.Request }; } return; } } private bool AuthorizeRequest(System.Net.Http.HttpRequestMessage request) { bool authorized = false; if (request.Headers.Contains(Constants.TOKEN_HEADER)) { var tokenValue = request.Headers.GetValues("TOKEN_HEADER"); if (tokenValue.Count() == 1) { var value = tokenValue.FirstOrDefault(); //Token validation logic here //set authorized variable accordingly } } return authorized; } } 

TOKEN_HEADER只是一个string,表示客户端应该传回的用于validation请求的HTTP头。

所以让我们来看看它

  1. 客户端请求安全数据
  2. 客户端未被授权,返回带有未经授权的状态码的响应
  3. 客户端发送凭证进行身份validation,应通过HTTPS进行保护
  4. 一旦validation,客户端通过HTTP头或任何适合您的方式接收令牌
  5. 客户端尝试再次请求安全数据,这次将令牌附加到请求
  6. AuthorizeTokenAttribute将validation令牌并允许执行该操作。

另外,请查阅John Petersen的这篇文章。 使您的ASP.NET Web API的安全

有很多方法来authentication用户的REST服务。 使用令牌是可能的,但是只要使用基本authentication就更简单了,就像标准和跨平台一样。

不要混淆授权和身份validation 。 [Authorize]属性全部是关于授权的,但是只有在用户使用其他机制进行了authentication之后。 没有进行适当的authentication,授权是完全没有用的。

最好的检查资源是Dominick Baier ,他是这方面的专家。

我用一个非常简单的方法:

  1. 用唯一的accessId和accessKey定义一个访问configuration文件(例如MD5散列的GUID值)
  2. 将此访问configuration文件存储在数据库
  3. 每个请求(GET / POST /等)必须提供accessId,queryHash(MD5散列值代表查询)和签名(queryHash + accessKey的MD5散列值)。 当然客户需要将accessKey保存在一个安全的地方!
  4. 服务器获取请求将检查accessId和签名使用相同的计算algorithm拒绝或授予访问(身份validation)
  5. 可以使用访问configuration文件在请求types的基础上进一步授权

使用新的ASP.NET MVC Web API的这种方法的服务可以服务于任何types的客户端:浏览器/ JavaScript和本地(桌面或移动)等

U可以使用ActionFilterAttribute并重写OnActionExecuting方法。 稍后在global.cs中注册此filter,以在Application Start方法中应用此filter来执行所有这些操作

var config = GlobalConfiguration.Configuration; config.Filters.Add(new CustomAuthAttribute());

{命名空间Customss {公共类CustomAuthAttribute:ActionFilterAttribute

 { public override void OnActionExecuting(HttpActionContext actionContext) { // To inforce HTTPS if desired , else comment out the code if (!String.Equals(actionContext.Request.RequestUri.Scheme, "https", StringComparison.OrdinalIgnoreCase)) { actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.BadRequest) { Content = new StringContent("HTTPS Required") }; return; } // get toekn from the header var userToken = actionContext.Request.Headers.GetValues("UserToken"); // Customer Logic to check the validity of the token. // U can have some DB logic to check , custom STS behind or some loca cache used to compare the values } } 

}}