몇 시간의 인터넷 검색 후 로그인 화면에서 ApiController 메소드의 Authorize 속성을 사용하여 사용자 권한을 인증하는 방법에 대한 명확한 예를 찾지 못한 방법에 놀랐습니다.
이 두 가지 개념에 대해 혼란스러워하기 때문입니다.
인증은 시스템이 사용자를 안전하게 식별 할 수있는 메커니즘입니다. 인증 시스템은 다음과 같은 질문에 대한 답변을 제공합니다.
- 사용자는 누구입니까?
- 사용자는 실제로 자신을 대표하는 사람입니까?
권한 부여는 시스템이 특정 인증 된 사용자가 시스템에서 제어하는 보안 리소스에 대해 어느 수준의 액세스 권한을 가져야하는지 결정하는 메커니즘입니다. 예를 들어, 데이터베이스 관리 시스템은 특정 개인에게 데이터베이스에서 정보를 검색 할 수 있지만 데이터베이스에 저장된 데이터를 변경하는 기능은 제공하지 않고 다른 개인에게는 데이터를 변경하는 기능을 제공하도록 설계 될 수 있습니다. 인증 시스템은 다음과 같은 질문에 대한 답변을 제공합니다.
- 사용자 X는 자원 R에 액세스 할 권한이 있습니까?
- 사용자 X에게 P 작업을 수행 할 권한이 있습니까?
- 사용자 X는 자원 R에 대해 P 작업을 수행 할 권한이 있습니까?
Authorize
MVC 의 속성은 다음과 같은 액세스 규칙을 적용하는 데 사용됩니다.
[System.Web.Http.Authorize(Roles = "Admin, Super User")]
public ActionResult AdministratorsOnly()
{
return View();
}
위 규칙 에 따라 관리자 및 수퍼 유저 역할의 사용자 만 메소드에 액세스 할 수 있습니다
이 규칙은 location
요소를 사용하여 web.config 파일에서 설정할 수도 있습니다 . 예:
<location path="Home/AdministratorsOnly">
<system.web>
<authorization>
<allow roles="Administrators"/>
<deny users="*"/>
</authorization>
</system.web>
</location>
그러나 이러한 권한 부여 규칙을 실행하기 전에 현재 웹 사이트에 대한 인증을 받아야 합니다 .
이것들은 무단 요청을 처리하는 방법을 설명하지만 LoginController와 같은 것을 보여 주거나 사용자 자격 증명을 요청하고 유효성을 검사하는 것과 같은 것을 분명히 보여주지는 않습니다.
여기에서 문제를 두 가지로 나눌 수 있습니다.
동일한 웹 애플리케이션에서 웹 API 서비스를 사용할 때 사용자를 인증하십시오.
ASP.Net 의 인증에 의존하기 때문에 가장 간단한 방법입니다.
이것은 간단한 예입니다.
Web.config
<authentication mode="Forms">
<forms
protection="All"
slidingExpiration="true"
loginUrl="account/login"
cookieless="UseCookies"
enableCrossAppRedirects="false"
name="cookieName"
/>
</authentication>
사용자는 계정 / 로그인 경로 로 리디렉션되며 사용자 자격 증명을 요청하는 사용자 지정 컨트롤을 렌더링 한 후 다음을 사용하여 인증 쿠키를 설정합니다.
if (ModelState.IsValid)
{
if (Membership.ValidateUser(model.UserName, model.Password))
{
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
return RedirectToAction("Index", "Home");
}
else
{
ModelState.AddModelError("", "The user name or password provided is incorrect.");
}
}
// If we got this far, something failed, redisplay form
return View(model);
크로스 플랫폼 인증
이 경우는 웹 응용 프로그램 내에서만 웹 API 서비스를 노출 하는 경우 서비스를 소비하는 다른 클라이언트가 있고 클라이언트는 다른 웹 응용 프로그램 또는 .Net 응용 프로그램 (Win Forms, WPF, 콘솔, Windows 서비스, 기타)
예를 들어, 동일한 네트워크 도메인 (인트라넷 내)의 다른 웹 응용 프로그램에서 웹 API 서비스를 사용한다고 가정합니다.이 경우 ASP.Net에서 제공하는 Windows 인증에 의존 할 수 있습니다.
<authentication mode="Windows" />
서비스가 인터넷에 노출되면 인증 된 토큰을 각 웹 API 서비스에 전달해야합니다.
자세한 내용은 다음 기사를 참조하십시오.