source

양식을 사용하여 더 많은 정보 저장인증.인증 쿠키 설정

manysource 2023. 9. 7. 21:48

양식을 사용하여 더 많은 정보 저장인증.인증 쿠키 설정

로그인을 위한 인증 쿠키 설정을 위해 aspx와 c#을 사용하고 있습니다.

FormsAuthentication.SetAuthCookie(UserName, True)

같은 쿠키에 더 많은 정보를 저장하고 싶습니다.이 인증 쿠키에 값을 추가할 수 있습니까? 아니면 두 번째 http 쿠키를 사용해야 합니까?

기본적으로 나는 사용자의 것을 저장할 방법을 찾고 있습니다.Id사용자 테이블 행 키를 사용하여 데이터베이스에 접근할 수 있습니다.

고마워요, 이든

양식에 사용자 데이터를 추가할 수 있습니다.인증티켓을 끊은 다음 직접 쿠키를 생성합니다.

양식에 대한 MSDN 문서에 예가 있습니다.인증티켓이요.

편집

티켓을 생성할 때는 일반적으로 web.config에 구성된 값과 동일한 시간 제한을 설정해야 합니다.불행히도 Framework 3.5 또는 그 이전에FormsAuthenticationclass는 이 시간 초과를 공개적으로 노출하지 않습니다.해결 방법은 이 연결 피드백 항목에 대한 응답에 설명된 방법 중 하나를 사용합니다.

갱신하다

안타깝게도 Connect 피드백 항목은 더 이상 존재하지 않습니다.기술이 무엇인지 간략하게 설명해 주셨으면 좋았을 텐데요.

네, 마이크로소프트가 과거의 Connect 항목을 폐기한 것은 유감스러운 일입니다.IIRC에서 제안한 두 가지 기법은 다음과 같습니다.

  1. WebConfigurationManager를 사용하여 관련 구성 섹션을 읽고 시간 초과 값을 가져옵니다.

  2. 다음을 사용하여 쿠키 만들기FormsAuthentication.GetAuthCookie, 를 사용하여 암호를 해독합니다.FormsAuthentication.Decrypt그리고 발생된 것을 검사합니다.FormsAuthenticationTicket.

또는 로 업그레이드합니다.NET 4.x 가 있는 곳에FormsAuthentication.Timeout소유물.

자세한 내용은 이 질문을 참조

당신에게 유용하기만 하면 당신이 원하는 것을 인증 쿠키에 넣을 수 있습니다.즉, 민감한 정보를 입력하는 경우에는 적어도 암호화해야 하지만, 민감한 정보는 입력하지 않는 것이 좋습니다.다음과 같은 작업을 수행할 수 있습니다.

Forms.SetAuthCookie (UserName + "|" + UserId, true);

그러면 사용자 이름이나 사용자 ID가 필요할 때는 언제든지 사용할 수 있습니다.쿠키를 로드하고 필요한 값을 분석하기만 하면 됩니다.

다시 한 번 말씀드리지만, 특히 위에서 말씀드린 바와 같이 이를 하지 말 것을 권합니다.하지만, 가능합니다.데이터를 빼내기 위해 접근자 메소드를 만들어야 합니다.

public int CurrentUserId
{
    get
    {
        int userId = 0;

        if (HttpContext.Current.Request.IsAuthenticated)
        {
            userId = Convert.ToInt32(HttpContext.Current.User.Identity.Name.Split('|')[1]);
        }

        return userId;
    }
}

public string CurrentUserName
{
    get
    {
        string userName = string.Empty;

        if (HttpContext.Current.Request.IsAuthenticated)
        {
            userName = HttpContext.Current.User.Identity.Name.Split('|')[0];
        }

        return userName;
    }
}

네, 더 많은 정보를 넣기 위해서는 "|"를 사용하는 것이 현명합니다.Microsoft에 오버로드된 다른 메서드가 있는 경우

public static void SetAuthCookie(String userName, bool createPersistentCookie, string userData)`

그러면 우리의 생활은 훨씬 쉬워지고, 우리의 코드는 더 안전해질 겁니다.

해당 사용자 ID를 userName 매개변수로 전달합니다.

FormsAuthentication.SetAuthCookie(userId, True)

인증 티켓은 어떻게 확보하고 있습니까?

를 할 에 추가 정보를 할 수 .UserDataFormsAuthenticationTicket:

using Newtonsoft.Json;
using System.Web;
using System.Web.Security;

public class LoggedInUser
{
    public string FirstName { get; set; } = null;
    public bool IsAdmin { get; set; } = false;
}

public static class Authentication
{
    static void SignIn(
        HttpContextBase context,
        string emailAddress,
        bool rememberMe,
        LoggedInUser user = null)
    {
        var cookie = FormsAuthentication.GetAuthCookie(
            emailAddress.ToLower(),
            rememberMe);
        var oldTicket = FormsAuthentication.Decrypt(cookie.Value);
        var newTicket = new FormsAuthenticationTicket(
            oldTicket.Version,
            oldTicket.Name,
            oldTicket.IssueDate,
            oldTicket.Expiration,
            oldTicket.IsPersistent,
            JsonConvert.SerializeObject(user ?? new LoggedInUser()));

        cookie.Value = FormsAuthentication.Encrypt(newTicket);

        context.Response.Cookies.Add(cookie);
    }

    static void SignOut(HttpContextBase context)
    {
        FormsAuthentication.SignOut();
    }

    static LoggedInUser GetLoggedInUser()
    {
        if (HttpContext.Current.User?.Identity?.Name != null && HttpContext.Current.User?.Identity is FormsIdentity identity)
            return JsonConvert.DeserializeObject<LoggedInUser>(identity.Ticket.UserData);

        return new LoggedInUser();
    }
}

자세한 내용: https://learn.microsoft.com/en-us/aspnet/web-forms/overview/older-versions-security/introduction/forms-authentication-configuration-and-advanced-topics-cs#step-4-storing-additional-user-data-in-the-ticket

언급URL : https://stackoverflow.com/questions/1149996/storing-more-information-using-formsauthentication-setauthcookie