【问题标题】:Basic authentication on a remote server远程服务器上的基本身份验证
【发布时间】:2015-04-24 18:57:46
【问题描述】:

我需要一些有关 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 方法的方便和适当的访问。现在它具有默认控制器,例如 Account 和 Home、默认视图等。

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

  2. 如何在 ServerService 上实现注册? ASMX 没有 AllowAnonymous 属性或其他东西,所以我无法注册用户,因为由于 401 错误,他无权访问任何方法。

提前谢谢你。

附:不,我不能使用 WCF 或其他东西。我需要实现一个 ASMX 网络服务。

更新 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 身份验证相关联。所以,这两个问题仍然悬而未决。希望我能理解,或者你会帮助我。

【问题讨论】:

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


    【解决方案1】:

    这里是添加 Web 引用到 ASMX 服务的文档。

    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服务实现的,该服务不使用基本身份验证而是匿名的(因为注册应该是匿名方法)。

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

    【讨论】:

      猜你喜欢
      • 2020-07-23
      • 1970-01-01
      • 1970-01-01
      • 2014-07-30
      • 1970-01-01
      • 1970-01-01
      • 2016-02-25
      • 2021-04-26
      相关资源
      最近更新 更多