programing

ASP에서 기본 인증.NET MVC 5

oldcodes 2023. 10. 16. 22:03
반응형

ASP에서 기본 인증.NET MVC 5

ASP에서 기본 인증을 구현하기 위해 어떤 단계를 수행해야 합니다.NET MVC 5?

OWIN은 쿠키리스 인증을 지원하지 않는다고 읽었는데, 일반적으로 기본 인증이 가능한가요?

여기에 사용자 지정 속성이 필요합니까?저는 이 속성들이 어떻게 작동하는지 잘 모르겠습니다.

사용자 지정 ActionFilter 특성을 사용하여 간단하면서도 효과적인 메커니즘을 사용할 수 있습니다.

public class BasicAuthenticationAttribute : ActionFilterAttribute
{
    public string BasicRealm { get; set; }
    protected string Username { get; set; }
    protected string Password { get; set; }

    public BasicAuthenticationAttribute(string username, string password)
    {
        this.Username = username;
        this.Password = password;
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var req = filterContext.HttpContext.Request;
        var auth = req.Headers["Authorization"];
        if (!String.IsNullOrEmpty(auth))
        {
            var cred = System.Text.ASCIIEncoding.ASCII.GetString(Convert.FromBase64String(auth.Substring(6))).Split(':');
            var user = new { Name = cred[0], Pass = cred[1] };
            if (user.Name == Username && user.Pass == Password) return;
        }
        filterContext.HttpContext.Response.AddHeader("WWW-Authenticate", String.Format("Basic realm=\"{0}\"", BasicRealm ?? "Ryadel"));
        /// thanks to eismanpat for this line: http://www.ryadel.com/en/http-basic-authentication-asp-net-mvc-using-custom-actionfilter/#comment-2507605761
        filterContext.Result = new HttpUnauthorizedResult();
    }
}

Basic Authentication(기본 인증)에 전체 컨트롤러를 넣을 때 사용할 수 있습니다.

[BasicAuthenticationAttribute("your-username", "your-password", 
    BasicRealm = "your-realm")]
public class HomeController : BaseController
{
   ...
}

또는 특정 작업 결과:

public class HomeController : BaseController
{
    [BasicAuthenticationAttribute("your-username", "your-password", 
        BasicRealm = "your-realm")]
    public ActionResult Index() 
    {
        ...
    }
}

추가 정보가 필요하시면 제가 주제로 작성한 이 블로그 게시물을 확인해보세요.

사용자 지정 특성을 사용하여 이 작업을 수행할 수 있습니다.오픈 소스 프로젝트 SimpleSecurity에는 기본 인증을 지원하는 사용자 지정 속성이 구현되어 있으며, 여기서 다운로드할 수 있습니다.사용 방법을 설명하기 위한 참조 응용 프로그램이 있습니다.원래는 MVC 4에서 Simple Membership과 함께 작동하기 위해 개발되었으며 최근에는 ASP를 사용하기 위해 포팅되었습니다.MVC 5의 NET 아이덴티티.

다크실에서 공유하는 답변을 수정하고 싶었습니다. 그 코드에 중대한 보안 결함이 있기 때문입니다.기록된 대로, res의 경우 해당 액션 필터는 실제로 요청을 종료하지 않습니다.End()가 호출됩니다.사용자에게 자격 증명을 묻는 메시지가 표시되고 자격 증명이 일치하지 않는 경우 401 응답이 반환되지만 컨트롤러 작업은 여전히 서버 측에서 실행됩니다.filterContext를 설정해야 합니다.요청이 제대로 종료되고 작업 메서드로 계속되지 않도록 속성을 지정합니다.

이는 제가 제3자로부터 데이터 피드를 받는 웹 서비스 엔드포인트를 보호하려고 했기 때문에 특히 제 상황에 좋지 않았습니다.기록한 대로, 이 액션 필터는 데이터가 여전히 내 액션 방식을 통해 푸시되고 있었기 때문에 아무것도 보호하지 못했습니다.

제 "빠른 해결책"은 다음과 같습니다.

public class BasicAuthenticationAttribute : ActionFilterAttribute
{
    public string BasicRealm { get; set; }
    protected string Username { get; set; }
    protected string Password { get; set; }

    public BasicAuthenticationAttribute(string username, string password)
    {
        this.Username = username;
        this.Password = password;
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var req = filterContext.HttpContext.Request;
        var auth = req.Headers["Authorization"];
        if (!String.IsNullOrEmpty(auth))
        {
            var cred = System.Text.ASCIIEncoding.ASCII.GetString(Convert.FromBase64String(auth.Substring(6))).Split(':');
            var user = new { Name = cred[0], Pass = cred[1] };
            if (user.Name == Username && user.Pass == Password) return;
        }
        var res = filterContext.HttpContext.Response;
        res.AddHeader("WWW-Authenticate", String.Format("Basic realm=\"{0}\"", BasicRealm ?? "Ryadel"));
        filterContext.Result = new HttpUnauthorizedResult();
    }
}

@Darkseal의 훌륭한 답변입니다.ASP와 함께 사용하기 위해 용도를 변경한 코드가 여기 있습니다.NET Web API(MVC에 가까운 사촌).같은 아이디어, 약간 다른 네임스페이스와 컨텍스트 클래스.클래스와 메소드에 정확히 동일한 방법으로 추가합니다.

using System.Web.Http.Controllers;
using System.Web.Http.Filters;

public class BasicAuthenticationAttribute : ActionFilterAttribute
{
    public string BasicRealm { get; set; }
    protected string Username { get; set; }
    protected string Password { get; set; }

    public BasicAuthenticationAttribute(string username, string password)
    {
        Username = username;
        Password = password;
    }

    public override void OnActionExecuting(HttpActionContext filterContext)
    {
        var req = filterContext.Request;
        var auth = req.Headers.Authorization;
        if (auth?.Scheme == "Basic")
        {
            var cred = Encoding.ASCII.GetString(Convert.FromBase64String(auth.Parameter)).Split(':');
            var user = new { Name = cred[0], Pass = cred[1] };
            if (user.Name == Username && user.Pass == Password) return;
        }
        filterContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized);
        filterContext.Response.Headers.Add("WWW-Authenticate", string.Format("Basic realm=\"{0}\"", BasicRealm ?? "YourRealmName"));
    }
}

HTTP 기본 인증에는 쿠키가 필요 없습니다.HTTP 요청의 헤더를 기반으로 합니다.헤더의 이름은 Authorization이고 값은 사용자 이름과 비밀번호를 문자열 "username:password"(모든 base64 인코딩)로 결합해야 합니다.

진심으로 저는 ASP로 기본인증을 사용한 적이 없습니다.NET MVC, 그러나 사용자 지정 속성을 만들기 위해 Web API를 사용했습니다(Web API의 경우 여기에서 시작하거나 MVC의 경우 여기에서 시작할 수 있습니다).

Nuget(AuthPackage)에서 이 패키지를 사용해 볼 수 있습니다. 이 패키지를 사용하면 asp.net mvc에 인증을 쉽게 추가할 수 있습니다.

  1. 패키지 관리자 콘솔을 사용하여 패키지 설치:

    설치-패키지 인증 패키지

  2. (appSettings)에서 Web.config에 연결 문자열을 추가합니다.

     <add key="connectionString" value="connectionStringHere" />
    
  3. 사용자를 등록하고 로그인하고 로그아웃할 준비가 되었습니다.

예:

 public async Task<ActionResult> SignIn()
    {
        var context = System.Web.HttpContext.Current;
        AuthUser authUser = new AuthUser(context);
        await authUser.SignIn("waleedchayeb2@gmail.com", "123456");
        return RedirectToAction("Index", "Home");
    }

여기에서 설명서를 읽을 수 있습니다.

다크씰의 대답

[BasicAuthenticationAttribute("your-username", "your-password", 
    BasicRealm = "your-realm")]

두 가지 단점이 있습니다. 이름과 암호가 하드코딩되어 있으며 단일 사용자만 지원합니다.

보다 유연한 솔루션은 구성에 저장된 여러 사용자 이름/비밀번호 쌍을 지원해야 합니다.

Microsoft는 샘플 https://gm/aspnet/samples/tree/main/samples/aspnet/WebApi/Basic Authentication에 대해 설명합니다.

public abstract class BasicAuthenticationAttribute : Attribute, IAuthenticationFilter

과중하여

abstract Task<IPrincipal> AuthenticateAsync(string userName, string password,   
CancellationToken cancellationToken);   

헤더의 사용자 이름/비밀번호가 사용자 이름/비밀번호 쌍의 구성/비밀 목록에 존재하는지 확인하는 검사를 구현할 수 있습니다.

기본 인증을 수행하는 HTTP 모듈을 생성할 수도 있습니다.ASP를 쉽게 연결할 수 있습니다.CheckPassword 메서드를 대체하여 NET 구성원 자격을 제공합니다.https://learn.microsoft.com/en-us/aspnet/web-api/overview/security/basic-authentication#basic-authentication-with-custom-membership

OWIN 구현 예 https://github.com/scottbrady91/Blog-Example-Classes/tree/master/OwinBasicAuthentication/WebApi

에서 구현 가능.넷코어는 https://github.com/mihirdilip/aspnetcore-authentication-basic 에 설명되어 있습니다.

우리의 애플리케이션은 Web.config의 다음 코드 때문에 "우연히" 기본 인증을 사용했습니다.

<system.webServer>
    <modules>
        <remove name="FormsAuthentication" />
    </modules>
    ... other stuff
</system.webServer>

그 외에는 양식 인증을 사용하도록 응용프로그램이 구성되어 있습니다.그렇지 않으면 일반 양식 인증이 사용될 때마다 브라우저 인증 창이 나타납니다.

언급URL : https://stackoverflow.com/questions/20144364/basic-authentication-in-asp-net-mvc-5

반응형