C# 如何在Web服务和移动电话之间进行身份验证?

C# 如何在Web服务和移动电话之间进行身份验证?,c#,.net,asp.net-mvc,web-services,C#,.net,Asp.net Mvc,Web Services,我想制作一个windows mobile 6手机应用程序。此应用程序将与我想要创建的web服务进行通信 我对网络服务和手机编程应用了解不多,所以我有几个问题要问 如何进行身份验证?就像我的用户加载我的应用程序并进入登录页面一样。他们输入他们的凭证。这将被发送到服务器并进行身份验证。现在我该寄什么回来?有什么形式的认证吗 在他们登录后,我是否必须继续检查他们是否登录?就像在asp.net mvc中一样,我在所有标记上都有属性。这样,任何人都不能直接键入该操作方法的url并访问它。但由于这是一个应用

我想制作一个windows mobile 6手机应用程序。此应用程序将与我想要创建的web服务进行通信

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

  • 如何进行身份验证?就像我的用户加载我的应用程序并进入登录页面一样。他们输入他们的凭证。这将被发送到服务器并进行身份验证。现在我该寄什么回来?有什么形式的认证吗

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

  • web服务是否有像asp.net mvc这样的授权标记?因为我可能需要一些类似的东西来确保没有人在他们的web浏览器中键入我的web服务路径并访问我在其中创建的所有方法

  • 我现在正在制作一个asp.net mvc应用程序,当用户在我的站点上键入他们的凭据时。它是发送什么,我猜是明文?对服务器进行哈希运算,然后进行检查。我知道也许有一天,当我能负担得起的时候,也许可以得到ssl,使它更安全

  • 那么我的问题是,如果将凭据从手机发送到服务器,它会比我现在的网站安全吗?差不多?可以做些什么使它更安全(又是SSL吗?)


    谢谢

    在将手持(Windows Mobile)应用程序连接到web服务时,我已经多次解决了这个问题。我使用的解决方案是在身份验证过程成功后,根据用户登录名和IP地址的散列创建cookie。e、 g.用户ID和pwd与服务器上的持久化凭据匹配。然后将此cookie传递回客户机,然后该客户机将与会话其余部分的所有web服务请求一起传递。e、 g.任何web方法的第一个参数都是cookie

    伪代码:

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

    当然,您确实希望使用SSL以避免以纯文本形式传递用户id和pwd。

    您还可以使用SOAP头传递用户凭据或身份验证令牌。您可以找到一篇关于如何在上执行此操作的文章,但总结一下,您创建了一个header类:

    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。假设我在手机应用程序上转到另一个表单,创建一个新的webservice对象。是否需要重新发送凭据?您也只能发送身份验证令牌而不是凭据。在这种情况下,您将首先要求web服务传递凭证中的令牌(作为SOAP头或常规web方法参数),然后对所有其他web方法调用使用具有单个属性(令牌)的另一个SOAP头。通过这种方式,您不需要对其他调用使用SSL,同时仍然保持方法签名的安全性。什么是身份验证令牌?我如何生成它?如果我想在此身份验证中添加角色检查,会发生什么。就像我有3个角色,有些方法只能由某些角色使用。身份验证令牌类似于sessionId,它可能是一个包含用户散列的字符串(如psasik的答案),也可能只是一个GUID。您可以在某种登录或身份验证web方法中发出它,然后使用来验证对web服务的其他调用是否由同一用户进行。在服务端,您通常会将生成的令牌存储在某个表中,以及对用户表的引用和发布日期(令牌通常只在一段时间内有效——与web会话过期的方式相同)。嗯,我想我明白了,但是有关于此的教程吗?