2014-05-12 4 views
1

사용자 로그인을 사용하여 .net으로 웹 앱을 만들고 있습니다. 등록 후 사용자의 데이터는 로컬 SQL 데이터베이스에 저장되므로 사용자는이를 사용하여 로그인 할 수 있어야합니다.ASP.NET MVC를 사용하여 사용자를 인증하는 방법은 무엇입니까?

현재 사용자를 등록 할 수 있으며 하드 코드 된 암호와 사용자 이름을 사용할 때 로그인 할 수 있지만 사용자의 자격 증명과 데이터베이스의 인증서를 검사 할 수있는 방법을 확인할 수 없습니다 일치하면.

나는 광범위한 연구를했지만 적절한 해결책을 찾지 못했지만 놀랍게도 효과적인 해결책을 찾지 못했습니다.

내 사용자 모델 :

namespace Models 
{ 
    public class Users 
    { 
     public int Id { get; set; } 
     public string userName { get; set; } 
     public string userPassword { get; set; } 
     public string userEmail { get; set; } 
     public string userCompany { get; set; } 


     public class UsersDBContext : DbContext 
     { 
      public DbSet<Users> Users { get; set; } 
     } 


    } 
} 

내 컨트롤러

namespace Eindwerk.Controllers 
{ 
    public class UsersController : Controller 
    { 
     private Users.UsersDBContext db = new Users.UsersDBContext(); 

     // GET: /Users/  
     public ActionResult Index() 
     { 
      return View(); 
     } 

     [HttpPost] 
     public ActionResult Index(Users users) 
     { 
      if (ModelState.IsValid) 
      { 
       if(users.userName == "NAAM" && users.userPassword == "WACHTWOORD") 
       { 
        FormsAuthentication.SetAuthCookie(users.userName, false); 
        return RedirectToAction("", "Home"); 
       } 
       { 
        ModelState.AddModelError("", "Invalid username and/or password"); 
       } 
      } 

      return View(); 
     } 

내보기

다음

내 현재 코드입니다
@model Eindwerk.Models.Users 

@{ 
    ViewBag.Title = "Login"; 
    Layout = "../_Login.cshtml"; 

} 
@using (Html.BeginForm()) { 
    @Html.ValidationSummary(true) 

    <div class="panel-body"> 
    <fieldset> 
     <div class="editor-field"> 
      @Html.TextBoxFor(model => model.userName, new { @class = "form-control", Value="Username"}) 
      @Html.ValidationMessageFor(model => model.userName) 
     </div> 
       <br /> 
     <div class="editor-field"> 
      @Html.TextBoxFor(model => model.userPassword, new { @class = "form-control", Value= "Password" }) 
      @Html.ValidationMessageFor(model => model.userPassword) 
     </div> 
     <br /> 
     <br /> 
     <p> 
      <input type="submit" value="SIGN IN" class="btn btn-outline btn-primary btn-lg btn-block"/> 
     </p> 

    </fieldset> 
     </div> 
} 

그래서 대신 if(users.userName == "NAAM" && users.userPassword == "WACHTWOORD") 사용자가 유효하고 내 데이터베이스에 등록되어 있는지 여부를 확인하고 싶습니다. 따라서 액세스 권한을 부여하거나 거부 할 수 있습니다.

아무도 적절한 해결책이 있습니까? 또는이 문제를 해결하려면 괜찮은 문서에 링크 하시겠습니까?

도움이 정말 감사합니다!

+0

귀하의 질문은보기에서 컨트롤러로 데이터를 보내는 방법 또는 해당 사용자가 이미 데이터베이스에 있는지 확인하는 방법입니까? –

+0

asp.net.identity를 사용하지 않는 이유는 무엇입니까? ? – stackunderflow

+0

실제로 전에 들어 보지 못했습니다 ... 등록/로그인 성공에 성공했지만 확실히 asp.net 신원을 살펴볼 것입니다! – user3629755

답변

1

db.Users 컬렉션을 참조해야합니다.

[HttpPost] 
public ActionResult Index(Users users) 
{ 
     if (ModelState.IsValid) 
     { 
      var hash = GenerateHash(users.userPassword,Settings.Default.salt); 
      var authUser = db.Users.FirstOrDefault(row => row.userName == users.userName && row.userPassword == hash) 
      if (authUser != null) 
      { 
       Session["role"] = authUser.Role; 

       FormsAuthentication.SetAuthCookie(users.userName, false); 
       return RedirectToAction("", "Home"); 
      } 
      else 
      { 
       ModelState.AddModelError("", "Invalid username and/or password"); 
      } 
     } 

     return View(); 
} 

private static string GenerateHash(string value, string salt) 
{ 
    byte[] data = System.Text.Encoding.ASCII.GetBytes(salt + value); 
    data = System.Security.Cryptography.MD5.Create().ComputeHash(data); 
    return Convert.ToBase64String(data); 
} 

염분 및 해싱에 대한 더 자세한 설명은 MD5 hash with salt for keeping password in DB in C#을 참조하십시오. 소금 값을 가진 Settings 클래스가 있다고 가정합니다. 이것을 소금을 얻기위한 다른 메커니즘으로 바꿀 수 있습니다.

+0

니스, 고마워요 B2K! 하루 종일 찾고 있었어! – user3629755

+0

어려운 측면 : 3 가지 역할 (관리자, 사용자 및 편집자)을 사용하고 싶습니다. 등록 된 사용자에게 어떻게 이러한 역할을 부여합니까? – user3629755

+3

제발 제발, 암호 해시 및 소금. 비밀 번호는 ** 일반 텍스트로 데이터베이스에 존재해서는 안됩니다 **! – arserbin3

관련 문제