MVC4应用程序和WCF:如何创建自定义身份验证
本文关键字:创建 自定义 身份验证 何创建 应用程序 WCF MVC4 | 更新日期: 2023-09-27 18:19:46
我正在玩Visual Studio,我创建了一个MVC4应用程序项目,其中包含一个身份验证部分(默认部分)。另一方面,我有一个web服务(WCF),它喜欢由SQL服务器管理的数据库,该数据库包含Users(登录,密码)表。我想将"默认"身份验证更改为链接到web服务提供的数据的身份验证。所以,需要明确的是:如何查询远程数据库来检查登录名/pwd的正确性?
只是想告诉你已经做了什么:会计主管:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginModel model, string returnUrl)
{
if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
{
return RedirectToLocal(returnUrl);
}
ModelState.AddModelError("", "Login or password not correct");
return View(model);
}
登录型号:
public class LoginModel
{
[Required]
[Display(Name = "User name")]
public string UserName { get; set; }
[Required]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }
}
登录形式:
@using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl })) {
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<fieldset>
<ol>
<li>
@Html.LabelFor(m => m.UserName)
@Html.TextBoxFor(m => m.UserName)
@Html.ValidationMessageFor(m => m.UserName)
</li>
<li>
@Html.LabelFor(m => m.Password)
@Html.PasswordFor(m => m.Password)
@Html.ValidationMessageFor(m => m.Password)
</li>
</ol>
<input type="submit" value="Login" />
我可以修改它吗?或者有其他方法可以进行这样的身份验证吗?谢谢编辑------------------
我试过那样做,但我有个问题。这是我的"新版本"登录功能:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginModel model, string returnUrl)
{
try
{
var context = new MyEntity(new Uri("http://localhost:12345/MyWCF.svc/"));
var usr = from user in context.PERSON
where user.LOGIN == model.UserName && user.PASSWORD == model.Password
select user;
List<PERSON> lpers = usr.ToList();
int nbRes = lpers.Count();
//if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
if (ModelState.IsValid && nbRes ==1)
{
return RedirectToLocal(returnUrl);
}
}
catch (DataServiceQueryException ex)
{
ModelState.AddModelError("", "Erreur : "+ex.ToString());
}
ModelState.AddModelError("", "Wrong username or pwd");
return View(model);
}
但我有以下错误:
System.Data.Services.Client.DataServiceQueryException: Une erreur s'est produite lors du traitement de cette requête. ---> System.Data.Services.Client.DataServiceClientException: <?xml version="1.0" encoding="utf-8" standalone="yes"?><error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"><code></code><message xml:lang="fr-FR">Une erreur s'est produite lors du traitement de cette requête.</message></error>
à System.Data.Services.Client.QueryResult.ExecuteQuery(DataServiceContext context)
à System.Data.Services.Client.DataServiceRequest.Execute[TElement](DataServiceContext context, QueryComponents queryComponents)
--- Fin de la trace de la pile d'exception interne ---
à System.Data.Services.Client.DataServiceRequest.Execute[TElement](DataServiceContext context, QueryComponents queryComponents)
à System.Data.Services.Client.DataServiceQuery`1.Execute()
à System.Data.Services.Client.DataServiceQuery`1.GetEnumerator()
à System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
à System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
à MyApp.Controllers.AccountController.Login(LoginModel model, String returnUrl) dans d:'....'Documents'Visual Studio 2012'Projects'MyProg'MyWS'Controllers'AccountController.cs:ligne 45
其中ligne 45是
List<SteelcaseWebPortal.SteelcaseService.PERSON> lpers = usr.ToList();
我的请求有错吗?谢谢
更简单的方法是将下面的方法更改为一个自定义方法,该方法将调用web服务。
WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe)
返回布尔值的新函数:
MyWebService.Login(model.UserName, model.Password)
如果您希望在cookie级别中保持身份验证。如果通过,则添加以下内容:
FormsAuthentication.SetAuthCookie(model.Username, model.RememberMe);