【问题标题】:How to do Authentication between a webservice and a mobile phone?如何在 Web 服务和手机之间进行身份验证?
【发布时间】:2009-11-23 19:02:11
【问题描述】:

我想制作一个 windows mobile 6 手机应用程序。此应用程序将与我想要创建的 Web 服务对话。

我对网络服务和手机编程应用了解不多,所以我有几个问题。

  1. 如何进行身份验证?就像我的用户加载我的应用程序并进入登录页面一样。他们输入他们的凭据。这将被发送到服务器并进行身份验证。现在我要寄回什么?是否有某种形式的 FormsAuthentication?

  2. 在他们登录后,我是否必须继续检查他们是否已登录?就像在 asp.net mvc 中一样,我的所有标签上都有 AuthorizeAttributes。这样,任何人都不能只输入该操作方法的 url 并能够访问它。但由于这是一个应用程序,我不确定他们是否可以(比如说)进入您的登录表单(第一个表单),然后以某种方式在不登录的情况下进入您的主表单(登录表单之后的那个)。

  3. Web 服务是否有像 asp.net mvc 这样的 Authorize 标签?因为我可能需要一些类似的东西来确保没有人在他们的网络浏览器中输入我的网络服务路径并访问我在其中创建的所有方法。

  4. 我现在正在制作一个 asp.net mvc 应用程序,当用户在我的网站上键入他们的凭据时。我猜它是明文发送的?到服务器散列,然后检查。我知道也许有一天我能负担得起,也许会获得 ssl 以使其更安全。

所以我的问题是,将凭据从手机发送到服务器会不会比我现在为我的网站所拥有的安全性低?差不多?可以做些什么来使其更安全(又是 SSL 吗?)。

谢谢

【问题讨论】:

    标签: c# .net asp.net-mvc web-services


    【解决方案1】:

    您还可以使用 SOAP 标头来传递用户凭据或身份验证令牌。你可以在Authentication for Web Services (using SOAP headers) 上找到一篇关于如何做到这一点的文章,但总而言之,你创建了一个头类:

    using System.Web.Services.Protocols;
    
    public class AuthHeader : SoapHeader
    {
        public string Username;
        public string Password;
    }
    

    您在 Web 服务上定义一个公共属性

    public AuthHeader AuthenticationInfo;
    

    并向您希望只有经过身份验证的用户才能访问的任何 Web 方法添加一些属性:

    [SoapHeader ("AuthenticationInfo", Required=true)]
    [WebMethod]
    public string HelloSecretWorld()
    {
        if(!(AuthenticationInfo.UserName == "Hello" && AuthenticationInfo.UserName.Password == "World"))
            throw new AuthenticationException();
    
        return "Hello World";
    }
    

    客户端代码如下所示:

    MyWebService ws = new MyWebService();
    ws.AuthenticationInfo = new AuthHeader {Username = "Hello", Password = "World"};
    Console.Out.WriteLine(ws.HelloSecretWorld());
    

    这样你就不需要修改方法的签名来添加认证了。

    【讨论】:

    • 那么我是否必须在每次操作时始终发送凭据?就像我看到你做了一个新的 webServiceObject。所以假设我在我的手机应用程序上转到另一个表单并创建一个新的 web 服务对象。我需要重新发送凭据吗?
    • 您也可以只发送身份验证令牌而不是凭据。在这种情况下,您将首先向 Web 服务请求传递您的凭据的令牌(作为 SOAP 标头或常规 Web 方法参数),然后使用具有单个属性 (Token) 的另一个 SOAP 标头用于所有其他 Web 方法调用。这样一来,您就不需要在其他调用中使用 SSL,同时仍然远离您的方法签名。
    • 什么是身份验证令牌?我如何生成它?如果我想为此身份验证添加角色检查会发生什么。就像我有 3 个角色,有些方法只能由某些角色使用。所以我也必须检查一下。
    • 身份验证令牌类似于 sessionId - 它可能是包含用户哈希的字符串(如 psasik 的答案)或只是一个 GUID。您将在某种登录或验证 Web 方法中发出它,然后用于验证对 Web 服务的其他调用是否由同一用户进行。在服务端,您通常会将生成的令牌连同对用户表的引用和发布日期一起存储在某个表中(令牌通常仅在一段时间内有效——与 Web 会话到期的方式相同)。跨度>
    • 嗯,我想我明白了,但是有这方面的教程吗?
    【解决方案2】:

    在从手持 (Windows Mobile) 应用程序连接到 Web 服务时,我不得不多次解决这个问题。我使用的解决方案是在身份验证过程成功后基于用户登录名和 IP 地址的哈希创建一个 cookie。例如用户 ID 和密码匹配服务器上的持久凭据。然后,您将此 cookie 传递回客户端,然后该 cookie 将与会话其余部分的所有 Web 服务请求一起传递。例如任何 Web 方法的第一个参数是 cookie。

    伪代码:

    string cookie = webServiceInstance.Authenticate("userName", "password");
    double balance = webServiceInstance.GetBalance(cookie, someId);
    

    当然,您确实想使用 SSL 以避免以纯文本形式传递您的用户 ID 和密码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-10
      • 2011-02-19
      • 2011-08-14
      • 2017-05-30
      • 2012-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多