远程服务器上的基本身份验证

时间:2015-04-24 18:57:47

标签: c# asp.net web-services authentication asmx

我需要一些ASMX网络服务方面的帮助。

假设我有 ServerService ,它提供了一些数据。我们假设它有一个方法GetRandomInteger,它返回一个随机整数(显然)。它使用IHttpModule实现自定义基本身份验证。

public class BasicAuthHttpModule : IHttpModule
{
    private UserRepository _userRepository;

    public void Dispose()
    {
    }

    public void Init(HttpApplication application)
    {
        _userRepository = new UserRepository();
        application.AuthenticateRequest += OnAuthenticateRequest;
        application.EndRequest += OnEndRequest;
    }

    public void OnAuthenticateRequest(object source, EventArgs e)
    {
        var app = (HttpApplication)source;

        string authHeader = app.Request.Headers["Authorization"];
        if (!string.IsNullOrEmpty(authHeader))
        {
            // Here I successfully get credentials from header

            if (_userRepository.ValidateUser(username, password)) return;

            // Return 401 and CompleteRequest
        }
        else
        {
            // Return 401 and End
        }
    }

    public void OnEndRequest(object source, EventArgs eventArgs)
    {
        if (HttpContext.Current.Response.StatusCode == 401)
        {
               // Return 401 and require new authorization
        }
    }

幸运的是,它有效。现在,我可以成功打开Service.asmx文件,获取基本身份验证窗口,并在成功验证后访问它的GetRandomInteger方法。

现在我有一个名为 ClientService 的ASP.NET MVC 4应用程序。它必须为用户界面提供对ServerService方法的方便和适当的访问。现在它有默认控制器,如帐户和主页,默认视图等。

  1. 我需要此ClientService在ServerService上进行身份验证。我的意思是会有一个带有按钮的主页/索引页面"登录"。我在那里输入登录名和密码,ClientService尝试在ServerService上进行身份验证。失败时返回错误或成功验证,提供对某些Home / RandomInt页面的访问,该页面将显示ServerService请求的整数。什么是最好和最简单的方法?

  2. 如何在ServerService上实现注册? ASMX上没有AllowAnonymous属性,因此我无法注册用户,因为他因401错误而无法访问任何方法。

  3. 提前谢谢。

    P.S。不,我不能使用WCF或其他东西。我需要实现ASMX Web服务。

    更新1:好的,我从这里学到了新的东西

    http://www.aspsnippets.com/Articles/How-to-add-reference-of-Web-Service-ASMX-in-ASPNet-using-Visual-Studio.aspx

    有一种旧式的东西,比如" Web引用"并且它不是"服务参考"。我已将此Web引用添加到我的项目中,现在我可以通过这种方式从此ASMX页面调用一些方法:

            try
            {
                ServerService svc = new ServerService();
                svc.Credentials = new NetworkCredential("user", "password");
                int a = svc.GetRandomInteger();
            } catch (WebException e) {
                // Auth failed
            }
    

    但是,我不了解如何将其与ASP.NET MVC ClientService身份验证相关联。所以,这两个问题仍然存在。希望我会理解它,否则你会帮助我。

1 个答案:

答案 0 :(得分:1)

以下是向ASMX服务添加Web引用的文档。

http://www.aspsnippets.com/Articles/How-to-add-reference-of-Web-Service-ASMX-in-ASPNet-using-Visual-Studio.aspx

使用此信息,我可以轻松地向Web服务发出请求。

在问题更新时我唯一要做的就是创建自定义身份验证。

  1. 当用户登录时,客户端会向服务发送请求。如果基本身份验证成功,它会为用户创建正确的FormsAuthentication cookie票证。用户登录。

  2. 在每个服务请求中,客户端从服务器缓存中提取FormsAuthentication cookie及其密码的登录信息,并使用它们对服务进行身份验证。如果基本验证失败(只有在服务端更改了用户密码才会发生),cookie将被清除并且会话中止。

  3. 使用另一个ASMX服务实现注册,该服务不使用基本身份验证但是匿名(因为注册应该是匿名方法)。

  4. 就是这样。最后,我找到了一个合适的解决方案:)