【问题标题】:ASP.net web API for user authentication.用于用户身份验证的 ASP.net Web API。
【发布时间】:2013-10-16 15:57:57
【问题描述】:

我必须编写一个 api,用于根据我们的用户访问管理提供商生成的唯一令牌对用户进行身份验证。

我们在 php 中开发的应用程序的过程,它管理使用用户名和密码对用户进行身份验证。在那个 php 应用程序上,我们有其他 .net 和 java 应用程序的链接。单击链接时,将联系第 3 方用户访问管理,这反过来会提供一个独特的令牌,类似于 guid,它作为查询字符串参数传递给 .net 应用程序。在我们的 .net 应用程序中,它在 2008 年开发的太旧了,它使用 vb 脚本来针对第 3 方用户管理应用程序验证该唯一令牌。

我做了很多研究,并试图编写一个 asp.net MVC4 Web Api 来摆脱 vb 脚本并使其可扩展。请让我知道我的方法是否正确或应该使用什么来完成以下要求

  • Api 应该能够为 PHP 主应用程序上提供的任意数量的应用程序链接提供服务。
  • 使用此 api 来验证令牌的其他应用程序将在 java 和 .net 中。
  • 我选择 mvc4 web api 来完成同样的事情是对的吗
  • 如果是,那么应该使用哪种类型的身份验证(基本、表单等)
  • 是否有任何示例代码可供查看,因为我发现了许多与我的场景无关的示例。

这些 java 和 .net 应用程序应该只根据从 php 应用程序传递的唯一令牌进行身份验证。

【问题讨论】:

    标签: c#-4.0 asp.net-mvc-4 authentication asp.net-web-api


    【解决方案1】:

    根据您的要求,Thinktecture's Identity Server 似乎非常适合您的需求。如果您导航到链接,该链接将详细说明它如何用作验证令牌的中心。我非常有信心这将回答您的问题清单!

    【讨论】:

    • 我检查了您提供的链接,但它更像是用于生成令牌的服务。在我的情况下,令牌已经生成并作为查询字符串参数传递。我的意思是令牌生成是通过我们正在使用的第三方提供商完成的。
    • 很抱歉,我似乎将您指向了错误的链接。 Web Api Security 的这种实现可能是您想到的 Identity Server 可能对于您正在寻找的东西有点过火。这提供了开箱即用的令牌身份验证
    【解决方案2】:

    您可以使用消息处理程序来设置 currentprincipal,如下所示:

    public class TokenAuthMessageHandler : DelegatingHandler
    {
        public TokenAssembler<Token> TokenAssembler { get; set; }
        const string SSOTOKEN = "token";
    
        protected override System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(
            HttpRequestMessage request,
            CancellationToken cancellationToken)
        {
            Token token;
            IEnumerable<string> headers;
            if (request.Headers.TryGetValues(SSOTOKEN, out headers))
            {
                token = TokenAssembler.Decrypt(headers.First());
            }
            else
            {
                var qs = HttpUtility.ParseQueryString(request.RequestUri.Query);
                var tokenstr = qs[SSOTOKEN];
                if (!string.IsNullOrEmpty(tokenstr))
                {
                    token = TokenAssembler.Decrypt(tokenstr);
                }
            }
    
            if (token != null) 
            {
               var principal = new GenericPrincipal(new GenericIdentity(Username), null);
               Thread.CurrentPrincipal = principal;
               HttpContext.Current.User = principal;
            }
            return base.SendAsync(request, cancellationToken)
               .ContinueWith(task =>
               {
                   var response = task.Result;
    
                   if (response.StatusCode == HttpStatusCode.Unauthorized
                       && !response.Headers.Contains(BasicAuthResponseHeader))
                   {
                       // redirect to some log in page?
                   }
                   return response;
               });
        }
    

    您可以像这样在 webapiconfig 中注册消息处理程序:

    config.MessageHandlers.Add(new TokenAuthMessageHandler() { TokenAssembler = MyTokenAssembler });
    

    【讨论】:

    • 只是想知道..不知道这是不是一个蹩脚的问题..上面代码中的 TOkenAssembler 类是什么?我不认为它是框架和自定义类的一部分。
    • 感谢您的回复。
    • TokenAssembler 是解密/加密您正在使用的令牌的类。
    • 是的,我一开始不明白,但最后我明白了。非常感谢。
    【解决方案3】:

    我发现这个链接对于决定使用什么非常简单和有用。我认为他以非常简单的方式提到了它。

    我从过去的 3 到 4 天一直在寻找这种解释,终于得到了它。虽然它没有提到 OpenID 和 OAuth 的实际实现,但值得一读。

    http://jamiekurtz.com/2013/01/14/asp-net-web-api-security-basics/

    【讨论】:

      猜你喜欢
      • 2012-07-28
      • 1970-01-01
      • 2012-06-16
      • 2017-10-22
      • 2014-05-02
      • 1970-01-01
      • 2015-09-17
      • 2017-07-30
      相关资源
      最近更新 更多