【问题标题】:MVC4 application and WCF : How to create custom authentication?MVC4 应用程序和 WCF:如何创建自定义身份验证?
【发布时间】:2013-06-26 05:21:57
【问题描述】:

我正在使用 Visual Studio,并且我创建了一个包含身份验证部分(默认部分)的 MVC4 应用程序项目。 另一方面,我喜欢由包含用户(登录名,密码)表的 SQL 服务器管理的数据库的 Web 服务 (WCF)。 我想将“默认”身份验证更改为链接到 Web 服务提供的数据的身份验证。 所以,要明确一点:如何查询远程数据库以检查登录/密码正确性?

只是为了让您了解已完成的工作: 帐户控制器:

 [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

45 号线在哪里

List<SteelcaseWebPortal.SteelcaseService.PERSON> lpers = usr.ToList();

我的请求做错了吗?谢谢!

【问题讨论】:

    标签: c# sql-server wcf asp.net-mvc-4 razor


    【解决方案1】:

    更简单的方法是将以下方法更改为自定义方法,以调用 Web 服务。

    WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe)
    

    返回布尔值的新的:

    MyWebService.Login(model.UserName, model.Password)
    

    如果您希望将身份验证保留在 cookie 级别。 if通过时添加以下内容:

    FormsAuthentication.SetAuthCookie(model.Username, model.RememberMe);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-01
      • 2011-03-18
      • 1970-01-01
      • 1970-01-01
      • 2015-11-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多