2013-07-14 23 views
19

Tôi cần nhận Hướng dẫn UserId trực tiếp sau khi đăng nhập thành công. Các mã sau đây không làm việc:User.Identity.IsAuthenticated là sai sau khi đăng nhập thành công

if (Membership.ValidateUser(txtUsername.Value, txtPassword.Value)) 
{ 
    FormsAuthentication.SignOut(); 
    FormsAuthentication.SetAuthCookie(txtUsername.Value, true); 

    if (HttpContext.Current.User.Identity.IsAuthenticated) 
    { 
     // doesn't run 
     Guid puk = (Guid)Membership.GetUser().ProviderUserKey;    
    } 
} 

đoạn mã sau làm việc:

if (Membership.ValidateUser(txtUsername.Value, txtPassword.Value)) 
{ 
    FormsAuthentication.SignOut(); 
    FormsAuthentication.SetAuthCookie(txtUsername.Value, true); 

    MembershipUser user = Membership.GetUser(txtUsername.Value); 

    if (user != null) 
    { 
     Guid puk = (Guid)user.ProviderUserKey; 
    } 
} 

Tại sao điều này xảy ra? Có điều gì khác để làm ngoài SetAuthCookie không?

Trả lời

13

Bởi vì khi bạn gọi FormsAuthentication.SetAuthCookie(txtUsername.Value, true); bạn lưu trữ khóa trên cookie của khách hàng. Đối với điều này, bạn cần phải làm một phản ứng cho người dùng. Và đối với HttpContext.Current.User.Identity để được lấp đầy với cookie, bạn cần thêm một yêu cầu.

Tóm lại chương trình của bạn trông như thế này:

  1. Client gửi tên và mật khẩu của mình.

  2. Máy chủ nhận và kiểm tra. Nếu chúng hợp lệ, máy chủ sẽ gửi tiêu đề Set-Cookie cho khách hàng.

  3. Khách hàng nhận và lưu trữ. Đối với mỗi yêu cầu khách hàng gửi cookie trở lại máy chủ.

CẬP NHẬT cho @Jake

Thêm một ví dụ về cách thiết lập User trong HttpContext

var identity = new System.Security.Principal.GenericIdentity(user.UserName); 
var principal = new GenericPrincipal(identity, new string[0]); 
HttpContext.Current.User = principal; 
Thread.CurrentPrincipal = principal; 

Lưu ý rằng bạn có thể tạo lớp chủ yếu tùy chỉnh của bạn kế thừa từ GenericPrincipal hoặc ClaimsPrincipal

+0

Có cách nào để truy cập User Identity trong cùng một yêu cầu không? –

+1

@AhmadAhmadi bạn có thể đặt thủ công gán đối tượng CustomPrincipal cho thuộc tính Người dùng của HttpContext. –

+0

@OleksiiAza Bạn có thể cập nhật câu trả lời của mình để chỉ cho bạn cách thực hiện điều này không? – Jake

22

tôi đã cùng một vấn đề. Tôi quên đặt cấu hình web.config.

Có thể bạn cũng đã bỏ lỡ.

<system.web> 
    <authentication mode="Forms"> 
     <forms loginUrl="~/user/login" timeout="1000" name="__Auth" /> 
    </authentication> 
    </system.web> 
0

Tôi đã thử tất cả các giải pháp trên, nhưng điều đó giải quyết vấn đề của tôi đã được cho ý kiến ​​này trong web.config

<modules> 
    <remove name="FormsAuthentication"/> 
</modules> 
0

Trong trường hợp môi trường phát triển của tôi, tài sản requireSSL được thiết lập là true, tôi đã khắc phục sự cố bằng cách thay đổi nó thành requireSSL = false.

enter image description here

Các vấn đề liên quan