2013-06-26 39 views
0

我试图自定义由Visal Studio项目提供的“默认身份验证”。 我有一个数据库,里面有一些用户链接到我的项目。我想要做的事情:确保登录名/密码对已在数据库中,因此连接用户。WCF,MVC4和身份验证:自定义错误

只给你一个什么样已经完成的想法: 的AccountController:

[HttpPost] 
[AllowAnonymous] 
[ValidateAntiForgeryToken] 
public ActionResult Login(LoginModel model, string returnUrl) 
{ 
    try 
    { 
     var context = new MyService.MyEntities2(new Uri("http://localhost:12345/MyWS.svc/")); 
     var usr = from user in context.PERSON 
        where user.LOGIN == model.UserName && user.PASSWORD == model.Password 
        select user; 
     List<MyWebPortal.MyService.PERSON> lpers = usr.ToList(); 
     int nbRes = lpers.Count(); 
     if (ModelState.IsValid && nbRes ==1) 
     { 
      return RedirectToLocal(returnUrl); 
     } 
    } 
    catch (DataServiceQueryException ex) 
    { 
     ModelState.AddModelError("", "Erreur : "+ex.ToString()); 
    } 
    ModelState.AddModelError("", "Authentication error"); 
    return View(model); 
} 

LoginModel:

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" /> 

,但我得到了以下错误:

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<MyWebPortal.MyService.PERSON> lpers = usr.ToList(); 

难道我做错事与要求?谢谢 !

+0

在将问题发布到SO之前,请将错误消息转换为英文。 –

+0

译文:“处理请求时发生错误”。对不起:) – Derbie

回答

0

好吧,它现在正在工作。我做了什么:我只是加了这条线:

var context = new SteelcaseService.SteelcaseEntities2(new Uri("http://localhost:12345/Steelcase.svc/")); 
----> var persons = context.PERSON.ToList(); 
var usr = from user in persons 
      where user.LOGIN == model.UserName && user.PASSWORD == model.Password 
      select user; 

请问您能解释一下原因吗?因为这不是我第一次使用这个技巧,我不知道它为什么会改变任何东西。同时,如果我有很多信息要恢复,我认为这不是一个好主意。

+0

您正在将整个'LoginModel'传递给无法转换为SQL的实体框架。将用户名和密码复制到本地变量并在LINQ查询中使用。还要考虑不要将密码作为纯文本存储在数据库中,而是至少使用腌制​​密码的散列(即MD5(密码+“某些盐,如用户标识”)) –