【问题标题】:How to setup auth token security for WebAPI requests?如何为 WebAPI 请求设置身份验证令牌安全性?
【发布时间】:2015-02-28 22:37:45
【问题描述】:

在遵循 this 教程(修改它以使用基于应用程序的身份验证字符串而不是其用户模型)中,定义以下 TokenValidationAttribute 并在 WebAPI 控制器上设置此属性以验证 API 请求是否到来在我的网络应用程序中:

public class TokenValidationAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        string token;

        try
        {
            token = actionContext.Request.Headers.GetValues("Authorization-Token").First();
        }
        catch (Exception)
        {
            actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.BadRequest)
            {
                Content = new StringContent("Missing Authorization-Token")
            };
            return;
        }

        try
        {
            var crypto = new SimpleCrypto.PBKDF2(); // type of encryption
            var authPart = ConfigurationManager.AppSettings["AuthorizationTokenPart"];
            var authSalt = GlobalVariables.AuthorizationSalt;
            var authToken = GlobalVariables.AuthorizationToken;

            if (authToken == crypto.Compute(authPart, authSalt))
            {
                // valid auth token
            }
            else
            {
                // invalid auth token
            }

            //AuthorizedUserRepository.GetUsers().First(x => x.Name == RSAClass.Decrypt(token));
            base.OnActionExecuting(actionContext);
        }
        catch (Exception ex)
        {
            actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Forbidden)
            {
                Content = new StringContent("Unauthorized User")
            };
            return;
        }
    }
}

在我的登录类中,我定义了以下方法,如果有效则返回 User 对象:

    private User IsValid(string username, string password)
    {
        var crypto = new SimpleCrypto.PBKDF2(); // type of encryption
        using (var db = new DAL.DbContext())
        {
            var user = db.Users
                .Include("MembershipType")
                .FirstOrDefault(u => u.UserName == username);
            if (user != null && user.Password == crypto.Compute(password, user.PasswordSalt))
            {
                return user;
            }
        }

        return null;
    }

如您所见,用户登录验证方法不会对 ~/api/User 进行 WebAPI 调用(该部分有效)。

1) 如何使用身份验证令牌生成请求(仅站点生成的 API 请求有效)?这些可能是来自代码隐藏的直接 API 调用,或者是基于 JavaScript (AngularJS) 的请求来水合某些对象。

2) 我不太清楚 base.OnActionExecuting(actionContext); 是什么。令牌有效/无效怎么办?

【问题讨论】:

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


    【解决方案1】:

    我认为发送授权标头的最佳做法是将其添加到请求标头中

    request.Headers.Add("Authorization-Token",bla bla bla);
    

    您可以创建 webrequest 或 httprequest 也许你应该从http://rest.elkstein.org/2008/02/using-rest-in-c-sharp.html开始 或http://msdn.microsoft.com/en-us/library/debx8sh9%28v=vs.110%29.aspx

    在我看来,为了创建适当的登录安全性并要求您应用诸如 openid 或 oauth 之类的标准

    干杯

    【讨论】:

      【解决方案2】:

      我做了这样的事情,LoginSession 包含我的令牌并且是静态的(在我的情况下它是一个共享服务(不是静态的))

              public HttpClient GetClient()
          {
              var client = new HttpClient
              {
                  Timeout = new TimeSpan(0, 0, 2, 0),
                  BaseAddress = new Uri(GetServiceAddress())
              };
              client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
      
              if (LoginSession.Token != null)
              {
                  client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", String.Format("Bearer {0}", LoginSession.Token.AccessToken));
              }
              return client;
          }
      

      注意这一行:

      client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", String.Format("Bearer {0}", LoginSession.Token.AccessToken));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-12
        • 2012-06-20
        • 1970-01-01
        • 2011-06-08
        • 1970-01-01
        • 1970-01-01
        • 2021-02-21
        • 2017-04-27
        相关资源
        最近更新 更多