programing

ASP의 사용자 지정 인증입니다.넷코어

batch 2023. 7. 10. 22:12
반응형

ASP의 사용자 지정 인증입니다.넷코어

저는 기존 사용자 데이터베이스와 통합해야 하는 웹 앱을 개발하고 있습니다.나는 여전히 사용하고 싶습니다.[Authorize]속성이지만 Identity 프레임워크를 사용하지 않습니다.Identity 프레임워크를 사용하려면 startup.cs 파일에 다음과 같은 내용을 추가합니다.

services.AddIdentity<ApplicationUser, IdentityRole>(options =>
{
    options.Password.RequireNonLetterOrDigit = false;
}).AddEntityFrameworkStores<ApplicationDbContext>()
  .AddDefaultTokenProviders();

거기에 다른 것을 추가한 다음 특정 인터페이스를 구현하는 클래스를 만들어야 한다고 생각합니다.누가 저를 올바른 방향으로 안내해 주시겠습니까?저는 지금 asp.net 5의 RC1을 사용하고 있습니다.

며칠간의 조사를 통해 알게 된 ASP 가이드는 다음과 같습니다.NetCore MVC 2.x 사용자 지정 사용자 인증

Startup.cs:

아래 행 추가ConfigureServices방법:

public void ConfigureServices(IServiceCollection services)
{

services.AddAuthentication(
    CookieAuthenticationDefaults.AuthenticationScheme
).AddCookie(CookieAuthenticationDefaults.AuthenticationScheme,
    options =>
    {
        options.LoginPath = "/Account/Login";
        options.LogoutPath = "/Account/Logout";
    });

    services.AddMvc();

    // authentication 
    services.AddAuthentication(options =>
    {
       options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    });

    services.AddTransient(
        m => new UserManager(
            Configuration
                .GetValue<string>(
                    DEFAULT_CONNECTIONSTRING //this is a string constant
                )
            )
        );
     services.AddDistributedMemoryCache();
}

위의 코드에서 인증되지 않은 사용자가 주석이 달린 작업을 요청할 경우 우리는 말했습니다.[Authorize]그들은 로 강제로 방향을 돌립니다./Account/Loginurl.

아래 행 추가Configure방법:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseBrowserLink();
        app.UseDatabaseErrorPage();
    }
    else
    {
        app.UseExceptionHandler(ERROR_URL);
    }
     app.UseStaticFiles();
     app.UseAuthentication();
     app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: DEFAULT_ROUTING);
    });
}

다음을 작성합니다.UserManager로그인 및 로그아웃도 관리하는 클래스입니다.아래 스니펫처럼 보여야 합니다(Dapper를 사용하고 있습니다).

public class UserManager
{
    string _connectionString;

    public UserManager(string connectionString)
    {
        _connectionString = connectionString;
    }

    public async void SignIn(HttpContext httpContext, UserDbModel user, bool isPersistent = false)
    {
        using (var con = new SqlConnection(_connectionString))
        {
            var queryString = "sp_user_login";
            var dbUserData = con.Query<UserDbModel>(
                queryString,
                new
                {
                    UserEmail = user.UserEmail,
                    UserPassword = user.UserPassword,
                    UserCellphone = user.UserCellphone
                },
                commandType: CommandType.StoredProcedure
            ).FirstOrDefault();

            ClaimsIdentity identity = new ClaimsIdentity(this.GetUserClaims(dbUserData), CookieAuthenticationDefaults.AuthenticationScheme);
            ClaimsPrincipal principal = new ClaimsPrincipal(identity);

            await httpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal);
        }
    }

    public async void SignOut(HttpContext httpContext)
    {
        await httpContext.SignOutAsync();
    }

    private IEnumerable<Claim> GetUserClaims(UserDbModel user)
    {
        List<Claim> claims = new List<Claim>();

        claims.Add(new Claim(ClaimTypes.NameIdentifier, user.Id().ToString()));
        claims.Add(new Claim(ClaimTypes.Name, user.UserFirstName));
        claims.Add(new Claim(ClaimTypes.Email, user.UserEmail));
        claims.AddRange(this.GetUserRoleClaims(user));
        return claims;
    }

    private IEnumerable<Claim> GetUserRoleClaims(UserDbModel user)
    {
        List<Claim> claims = new List<Claim>();

        claims.Add(new Claim(ClaimTypes.NameIdentifier, user.Id().ToString()));
        claims.Add(new Claim(ClaimTypes.Role, user.UserPermissionType.ToString()));
        return claims;
    }
}

그럼 아마 당신은AccountController가 있는 것Login다음과 같은 작업:

public class AccountController : Controller
{
    UserManager _userManager;

    public AccountController(UserManager userManager)
    {
        _userManager = userManager;
    }

    [HttpPost]
    public IActionResult LogIn(LogInViewModel form)
    {
        if (!ModelState.IsValid)
            return View(form);
         try
        {
            //authenticate
            var user = new UserDbModel()
            {
                UserEmail = form.Email,
                UserCellphone = form.Cellphone,
                UserPassword = form.Password
            };
            _userManager.SignIn(this.HttpContext, user);
             return RedirectToAction("Search", "Home", null);
         }
         catch (Exception ex)
         {
            ModelState.AddModelError("summary", ex.Message);
            return View(form);
         }
    }
}

이제 사용할 수 있습니다.[Authorize]에 대한 주석.Action또는Controller.

질문이나 버그에 대해 자유롭게 의견을 제시하십시오.

ASP.NET Core에서 사용자 정의 인증을 만드는 방법은 다양합니다.기존 구성 요소를 구축하고 싶지만 ID를 사용하지 않으려면 docs.asp.net 에서 문서의 "보안" 범주를 확인하십시오.https://docs.asp.net/en/latest/security/index.html

도움이 될 수 있는 몇 가지 기사:

ASP.NET ID 없이 쿠키 미들웨어 사용

사용자 지정 정책 기반 권한 부여

물론, 만약 그것이 실패하거나 문서가 충분히 명확하지 않다면, 소스 코드는 https://github.com/dotnet/aspnetcore/tree/master/src/Security 에 있습니다. 여기에는 몇 가지 샘플이 포함되어 있습니다.

.NET Core 3에서 솔루션을 구현할 모든 사용자를 위해 훌륭한 @AmiNadimi 답변에 추가하고자 합니다.

우선, 당신은 다음의 서명을 변경해야 합니다.SignIn의 방법.UserManager클래스:

public async void SignIn(HttpContext httpContext, UserDbModel user, bool isPersistent = false)

대상:

public async Task SignIn(HttpContext httpContext, UserDbModel user, bool isPersistent = false)

절대로 사용해서는 안 되기 때문입니다.async void특히 당신이 함께 일한다면요.HttpContext출처:마이크로소프트 문서

마지막, 하지만 중요한 것은, 당신의Configure().Startup.cs에는 포해야합니가 포함되어야 합니다.app.UseAuthorization그리고.app.UseAuthentication적절한 순서대로:

if (env.IsDevelopment())
{
    app.UseDeveloperExceptionPage();
}
else
{
    app.UseExceptionHandler("/Home/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAuthentication();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}/{id?}");
});

@Manish Jain, 저는 부울 리턴으로 메소드를 구현할 것을 제안합니다.

public class UserManager
{

    // Additional code here...            

    public async Task<bool> SignIn(HttpContext httpContext, UserDbModel user)
    {
        // Additional code here...            

        // Here the real authentication against a DB or Web Services or whatever 
        if (user.Email != null)
            return false;                    

        ClaimsIdentity identity = new ClaimsIdentity(this.GetUserClaims(dbUserData), CookieAuthenticationDefaults.AuthenticationScheme);
        ClaimsPrincipal principal = new ClaimsPrincipal(identity);

        // This is for give the authentication cookie to the user when authentication condition was met
        await httpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal);
        return true;
    }
}

언급URL : https://stackoverflow.com/questions/36095076/custom-authentication-in-asp-net-core

반응형