Đặt Lại Cookie và Buộc Đăng Nhập Lại Sử Dụng ASP.NET Core Identity

Bài viết này xem xét việc triển khai đặt lại cookie trong một ứng dụng ASP.NET Core sử dụng máy chủ Duende identity server liên kết với Entra ID. Đôi khi cookie cần được đặt lại cho người dùng cuối do các vấn đề về kích thước, hoặc các lỗi máy chủ xác thực từ xa không xác định. Cookie có thể được xóa và buộc đăng nhập mới.

Code: https://github.com/damienbod/DuendeProfileServiceAspNetCoreIdentity

Thiết Lập

Ứng dụng web ASP.NET Core được thiết lập để xác thực bằng cách sử dụng một máy chủ identity được triển khai bằng ASP.NET Core Identity và Duende IdentityServer. Nhà cung cấp identity liên kết với Entra ID bằng OpenID Connect. Trong trường hợp sử dụng của chúng tôi, tài khoản Microsoft được mời vào tenant Entra ID với tư cách khách và login.live.com được sử dụng để xác thực người dùng Tài khoản Microsoft. Chúng tôi muốn cung cấp đặt lại cookie cho hai ứng dụng ASP.NET Core và buộc một luồng đăng nhập. Người dùng có thể vẫn được xác thực trong Entra ID hoặc Live và người dùng sẽ được xác thực lại tự động. Điều này chỉ cung cấp việc dọn dẹp cookie trong ứng dụng của bạn. Nếu bạn muốn đăng xuất, hãy sử dụng phương thức SignOut tiêu chuẩn với các scheme yêu cầu đúng.

Image 1

Đặt Lại

Một trang Razor ASP.NET core được sử dụng để gửi yêu cầu POST đặt lại cookie.

<form method="post">
    <input type="submit" class="btn btn-warning" name="Reset">
</form>

Yêu cầu POST xóa tất cả cookie cho ứng dụng nhà cung cấp identity và chuyển hướng đến ứng dụng OpenID Connect client sử dụng chuyển hướng HTTP.

public IActionResult OnPost()
{
    // clear cache if needed
    foreach (var cookie in Request.Cookies.Keys)
    {
        Response.Cookies.Delete(cookie);
    }
    // bubble up to a UI application if required
    return Redirect("https://localhost:5015/resetcache");
}

Chuyển hướng HTTP GET xóa tất cả cookie trên ứng dụng OpenID Connect client và chuyển hướng đến trang mặc định yêu cầu người dùng được xác thực. Thử thách mặc định được kích hoạt và bắt đầu một luồng xác thực. Nếu người dùng được xác thực trong Entra ID, danh tính sẽ được xác thực lại một cách tự động.

[AllowAnonymous]
public class Index : PageModel
{
    public IActionResult OnGet()
    {
        // clear the cookie cache
        foreach (var cookie in Request.Cookies.Keys)
        {
            Response.Cookies.Delete(cookie);
        }
        // Force a sign-in
        return Redirect("/");
    }
}

Xử Lý Lỗi Từ Xa

Việc đặt lại cookie có thể được sử dụng để xử lý các lỗi xác thực OpenID Connect từ xa không xác định đôi khi thất bại vì những lý do không xác định và người dùng không thể phục hồi nếu không đặt lại cookie cục bộ.

OnRemoteFailure = async context =>
{
    var logger = context.HttpContext
        .RequestServices.GetRequiredService<ILogger<Program>>();

    logger.LogInformation(
        "OnRemoteFailure from identity provider. Scheme: {Scheme: }", 
        context.Scheme.Name);
    
    if (context.Failure != null)
    {
        //server_error
        context.HandleResponse();
        context.Response.Redirect(
            $"/Home/Reset?remoteError={context.Failure.Message}");
    }
    await Task.CompletedTask;
}

Ghi Chú

Thông thường điều này không nên được yêu cầu. Logic đăng xuất mặc định nên được sử dụng nếu cần đăng xuất. Logic này chỉ dành cho việc đặt lại cục bộ và không đăng xuất người dùng. Thay đổi trạng thái trên HTTP GET cũng không được khuyến nghị nhưng điều này cần thiết để hoạt động.

Tại sao không chỉ cần đăng xuất?

Sử dụng phương thức SignOut là cách đúng để đăng xuất khỏi một ứng dụng ASP.NET core. Bằng cách sử dụng các scheme khác nhau, mỗi cái có thể được đăng xuất. Việc xóa cookie khỏi trình duyệt không đăng xuất người dùng. Điều này chỉ dọn dẹp cookie cục bộ và mọi thứ được lưu đằng sau chúng.

Còn về cache thì sao?

Nếu phiên được lưu trữ trong phiên máy chủ hoặc cache máy chủ, thì bạn sẽ cần phải dọn dẹp điều này chứ không chỉ là cookie.

Điều gì xảy ra trên nhà cung cấp identity bên ngoài?

Chúng tôi không kiểm soát điều này trực tiếp và không thể kiểm soát các phiên ở đây. Để xóa phiên, bạn cần gửi một yêu cầu **endsession** đến máy chủ OpenID Connect.

Liên Kết

Chia sẻ bài viết này:

Loading…

Liên quan

Tags: Azure, cloud, Microsoft, Security, technology

Chỉ mục