ASP.NET MVC 5에서 사용자 지정 인증을 구현하는 방법


80

ASP.NET MVC 5 응용 프로그램을 개발 중입니다. ADO.NET 엔터티 데이터 모델을 만든 기존 DB가 있습니다. DB에 "사용자 이름"과 "비밀번호"열이 포함 된 테이블이 있는데이를 사용하여 웹앱에서 인증 및 권한 부여를 구현하고 싶습니다. 다른 데이터베이스, 테이블 또는 열을 만들 수 없으며 고객 요구 사항으로 인해 표준 ID 인증을 사용할 수 없습니다. 가입, 비밀번호 변경 또는 기타 작업을 관리 할 필요가 없습니다. 비밀번호와 사용자 이름으로 로그인하기 만하면됩니다. 어떻게 할 수 있습니까?

답변:


158

그래 넌 할수있어. 인증 및 권한 부여 부분은 독립적으로 작동합니다. 자체 인증 서비스가있는 경우 OWIN의 인증 부분 만 사용할 수 있습니다. 고려 당신이 이미 가지고 UserManager있는 유효성을 확인 username하고 password. 따라서 포스트 백 로그인 작업에 다음 코드를 작성할 수 있습니다.

[HttpPost]
public ActionResult Login(string username, string password)
{
    if (new UserManager().IsValid(username, password))
    {
        var ident = new ClaimsIdentity(
          new[] { 
              // adding following 2 claim just for supporting default antiforgery provider
              new Claim(ClaimTypes.NameIdentifier, username),
              new Claim("http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", "ASP.NET Identity", "http://www.w3.org/2001/XMLSchema#string"),

              new Claim(ClaimTypes.Name,username),

              // optionally you could add roles if any
              new Claim(ClaimTypes.Role, "RoleName"),
              new Claim(ClaimTypes.Role, "AnotherRole"),

          },
          DefaultAuthenticationTypes.ApplicationCookie);

        HttpContext.GetOwinContext().Authentication.SignIn(
           new AuthenticationProperties { IsPersistent = false }, ident);
        return RedirectToAction("MyAction"); // auth succeed 
    }
    // invalid username or password
    ModelState.AddModelError("", "invalid username or password");
    return View();
}

사용자 관리자는 다음과 같을 수 있습니다.

class UserManager
{
    public bool IsValid(string username, string password)
    {
         using(var db=new MyDbContext()) // use your DbConext
         {
             // for the sake of simplicity I use plain text passwords
             // in real world hashing and salting techniques must be implemented   
             return db.Users.Any(u=>u.Username==username 
                 && u.Password==password); 
         }
    }
}

결국 Authorize속성 을 추가하여 작업이나 컨트롤러를 보호 할 수 있습니다 .

[Authorize]
public ActionResult MySecretAction()
{
    // all authorized users can use this method
    // we have accessed current user principal by calling also
    // HttpContext.User
}

[Authorize(Roles="Admin")]
public ActionResult MySecretAction()
{
    // just Admin users have access to this method
} 

7
귀하의 질문에 답하기 위해 게시물을 업데이트했습니다.
Sam FarajpourGhamari

5
이봐, 나는 당신의 github 예제 (tokenauth 용)가 내 문제를 해결했다는 것을 알려 드리고 싶었습니다. 정말 감사합니다! 내가 할 수 있다면 나는 당신의 예제를 1000 번 upvote 할 것입니다 :)
AME

6
필요한 nuget 패키지 :-Microsoft.AspNet.Identity.Core-Microsoft.AspNet.Identity.Owin-Microsoft.Owin-Microsoft.Owin.Host.SystemWeb-Microsoft.Owin.Security-Microsoft.Owin.Security.Cookies-Microsoft.Owin .Security.OAuth-Owin
Matthieu

5
이 질문에 대한 공개 현상금이 있었으면 좋겠습니다. 그러면 +1000을 드릴 수 있습니다. 검색 엔진이 접근 할 수 있도록 블로그 어딘가에 게시하세요. 매우 쉽고 우아한 솔루션입니다. 나는 OWIN과 OAuth2가 제공하는 것에 대해 이틀 동안 읽었고 와이어를 연결할 수 없었습니다.
adopilot

2
@SamFarajpourGhamari : Login코드 에 긴 const 문자열이 필요한 이유를 설명해 주 시겠습니까? ... new Claim("http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", "ASP.NET Identity", "http://www.w3.org/2001/XMLSchema#string")코드가 없어도 잘 작동하는지 확인했습니다!
S.Serpooshan 2016-10-29
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.