实现基于Forms认证的WebService应用需要以下几个步骤:
- 在web.config文件中配置Forms认证和WebService
首先要在web.config文件中配置Forms认证和WebService。示例代码如下:
<configuration>
<system.web>
<authentication mode="Forms">
<forms loginUrl="Login.aspx" timeout="2880" />
</authentication>
<authorization>
<allow users="*" />
</authorization>
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5" />
</system.web>
<system.web.services>
<protocols>
<add name="HttpGet"/>
<add name="HttpPost"/>
</protocols>
</system.web.services>
</configuration>
上述代码中,authentication
节点将认证模式设置为Forms,loginUrl
表示登录页的路径,timeout
表示过期时间。authorization
节点中,allow
中的users
属性值为*
表示允许所有用户访问。
system.web.services
节点用于配置WebService的支持协议。在这里,我们配置了支持HttpGet
和HttpPost
两种协议。
- 创建WebService
创建WebService需要先在Visual Studio中新建一个Web项目,然后添加一个ASMX文件,这个ASMX文件包含WebService的类。示例代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Security;
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class MyWebService : System.Web.Services.WebService
{
[WebMethod]
public string Hello(string name)
{
if (HttpContext.Current.User.Identity.IsAuthenticated)
{
FormsIdentity id = HttpContext.Current.User.Identity as FormsIdentity;
FormsAuthenticationTicket ticket = id.Ticket;
string userData = ticket.UserData;
return string.Format("Hello {0}, your name is {1}, and you are in {2} role.", name, userData, Roles.GetRolesForUser(name)[0]);
}
else
{
return "Not authenticated.";
}
}
}
上述代码中,MyWebService
是我们创建的WebService类名,包含了一个Hello
方法,Hello
方法接受一个字符串参数name
,并返回一个字符串。在Hello
方法中,我们检查用户是否已通过认证。如果已通过认证,就从FormsAuthentication
对象中获取用户信息,否则返回错识信息。
- 编写登录页面
我们需要编写一个登录页面,让用户在这个页面上输入用户名和密码,然后将输入的用户名和密码提交到服务器端进行验证。在验证通过之后,我们需要使用Forms认证来设置身份验证Cookie,并重定向到指定的页面。示例代码如下:
protected void Button1_Click(object sender, EventArgs e)
{
if (FormsAuthentication.Authenticate(txtUserName.Text, txtPassword.Text))
{
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, txtUserName.Text, DateTime.Now, DateTime.Now.AddMinutes(30), true, Roles.GetRolesForUser(txtUserName.Text)[0], FormsAuthentication.FormsCookiePath);
string encTicket = FormsAuthentication.Encrypt(ticket);
Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket));
Response.Redirect("Default.aspx");
}
else
{
lblMsg.Text = "Invalid username or password.";
}
}
上述代码中,我们使用FormsAuthentication.Authenticate
方法来验证用户输入的用户名和密码,如果验证通过就创建一个FormsAuthenticationTicket
对象,并使用FormsAuthentication.Encrypt
方法来加密这个对象。最后,我们将加密后的数据作为一个Cookie添加到响应中,并重定向到默认页面。
- 测试WebService
创建好WebService和登录页面之后,我们可以测试一下这个应用是否正常工作。在浏览器的地址栏中输入WebService的访问地址,例如:http://localhost:12345/MyWebService.asmx/Hello?name=TestUser,其中,name
参数传递了一个名为“TestUser”的字符串。如果一切正常,我们应该能够看到浏览器中输出了一个“Hello”的欢迎信息,包含了用户的名称和角色信息。
至此,我们已经完成了基于Forms认证的WebService应用的实现过程。
示例说明1:
如果我们希望WebService只能被指定的角色访问,我们可以在web.config文件中添加以下代码:
<authorization>
<allow roles="Admin"/>
<deny users="*"/>
</authorization>
上述代码中,“Admin”是一个指定的角色名。这意味着只有授予了“Admin”角色的用户才能访问这个WebService。
示例说明2:
如果我们需要在调用WebService时传递复杂的数据类型,例如对象或集合,我们可以使用JSON或XML格式。首先,我们需要在ASMX文件中添加以下属性:
[ScriptService]
接下来,我们需要在页面中添加引用:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
最后,我们使用jQuery中的ajax
方法来调用WebService,例如:
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
url: "MyWebService.asmx/MyMethod",
data: JSON.stringify({ name: "TestUser", age: 20 }),
dataType: "json",
success: function(data) {
alert(data.d);
}
});
上述代码中,我们使用了jQuery的ajax
方法来向MyMethod
方法传递一个JSON对象。contentType
用于设置请求头的内容类型,dataType
用于设置返回值的数据类型。在success
回调函数中,我们可以获取返回的数据,并将其显示在页面中。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:ASP.NET实现基于Forms认证的WebService应用实例 - Python技术站