C# 如何在Web服务和移动电话之间进行身份验证?
我想制作一个windows mobile 6手机应用程序。此应用程序将与我想要创建的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)应用程序连接到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会话过期的方式相同)。嗯,我想我明白了,但是有关于此的教程吗?