2014-04-22 19 views
21

Tôi đang cố gắng hiểu xác thực và ủy quyền tài khoản cá nhân của Asp.net Web Api. Tôi đã xem một số hướng dẫn trên web bao gồm this one. Tóm lại, khi một tác nhân người dùng cung cấp tên người dùng và mật khẩu, API sẽ phát hành một mã thông báo mà khách hàng sẽ sử dụng trong các cuộc gọi tiếp theo tới API để xác định chính nó. Tác nhân người dùng nhận được mã thông báo bằng cách đưa ra yêu cầu, thường là: http://example.com/Token. Đường dẫn dường như được đặt trong lớp Khởi động như vậy:Trong kiến ​​trúc Web Api/Owin, các yêu cầu tới '/ token' được xử lý ở đâu?

TokenEndpointPath = new PathString("/Token") 

Vấn đề của tôi là, tôi không thể tìm thấy bất kỳ phương pháp điều khiển nào phù hợp với đường dẫn đó. Cái này hoạt động ra sao?

Trả lời

27

Khi bạn tạo một dự án mới với xác thực cá nhân trong ASP.NET, giải pháp được tạo với nhà cung cấp OAuth để xử lý yêu cầu xác thực.

Nếu nhìn vào giải pháp của bạn, bạn sẽ thấy Thư mục nhà cung cấp có lớp ApplicationOAuthProvider.

Lớp này triển khai tất cả logic để xác thực thành viên của bạn trong trang web của bạn. Cấu hình được đặt tại Khởi động để cho phép bạn tùy chỉnh điểm cuối url thông qua OAuthOption.

OAuthOptions = new OAuthAuthorizationServerOptions 
{ 
    TokenEndpointPath = new PathString("/Token"), 
    Provider = new ApplicationOAuthProvider(PublicClientId), 
    AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"), 
    AccessTokenExpireTimeSpan = TimeSpan.FromDays(14), 
    AllowInsecureHttp = true 
}; 

Thuộc tính Đường dẫn TokenEndPoint xác định url sẽ kích hoạt phương thức GrantResourceOwnerCredentials của GrandResourceOwnerCredentials.

Nếu bạn sử dụng cáy để xác thực và sử dụng loại này của cơ thể

grant_type=password&username=testUserName&password=TestPassword 

bạn nên vượt qua trong các phương pháp sau đây:

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
    { 
     var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>(); 

     ApplicationUser user = await userManager.FindAsync(context.UserName, context.Password); 

     if (user == null) 
     { 
      context.SetError("invalid_grant", "The user name or password is incorrect."); 
      return; 
     } 

     ClaimsIdentity oAuthIdentity = await user.GenerateUserIdentityAsync(userManager, 
      OAuthDefaults.AuthenticationType); 
     ClaimsIdentity cookiesIdentity = await user.GenerateUserIdentityAsync(userManager, 
      CookieAuthenticationDefaults.AuthenticationType); 

     AuthenticationProperties properties = CreateProperties(user.UserName); 
     AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, properties); 
     context.Validated(ticket); 
     context.Request.Context.Authentication.SignIn(cookiesIdentity); 
    } 

nơi context.UserName và context.Password được thiết lập với các dữ liệu được sử dụng trong yêu cầu. Sau khi danh tính được xác nhận (ở đây sử dụng Entity Framework và một tên người dùng, Mật khẩu trong cơ sở dữ liệu), một mã thông báo Bearer được gửi đến người gọi. Mã thông báo Vòng đệm này sau đó có thể được sử dụng để được xác thực cho các cuộc gọi khác.

Trân trọng.

+0

Cảm ơn câu trả lời. Nó xóa mọi thứ! – Joe

+0

@Jeremie, cảm ơn vì đã dọn dẹp. Lời giải thích thực sự tuyệt vời và đây là vấn đề chính xác của tôi. Bất cứ ai có thể vui lòng cho tôi biết nếu sử dụng mã thông báo mặc định oauth này là cách tốt nhất và an toàn nhất để triển khai bảo mật trong API của bạn? Tôi đang bận rộn phát triển một API sẽ được tiếp xúc với internet và được sử dụng bởi một ứng dụng di động góc cạnh mà tôi hiện đang làm việc. Bất kỳ lựa chọn thay thế nào khác? Nhiều đánh giá cao. – fransHbrink

+0

@Jeremie, Có thể có nhiều url điểm cuối mà tất cả trỏ đến cùng một ứng dụng IAppBuilder. Nếu không làm thế nào chúng ta có thể có nhiều điểm cuối toke trong một ứng dụng api web? – Jami

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