0

我必须编写一个 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 应用程序传递的唯一令牌进行身份验证。

4

3 回答 3

0

您可以使用消息处理程序来设置 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 });
于 2013-10-10T06:35:19.883 回答
0

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

于 2013-10-09T14:40:20.847 回答
0

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

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

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

于 2013-10-11T10:37:35.767 回答