2016-08-16 16 views
7

All,ASP.NET nhận dạng 2.0 Authenticate chống lại máy chủ của chúng ta mang

Tôi đã có một máy chủ bảo mật mà mục đích duy nhất là cung cấp thẻ vô danh từ một thiết bị đầu cuối duy nhất: yêu cầu http://example.com/token

Ví dụ:

phản ứng
POST http://example.com/token HTTP/1.1 
User-Agent: Fiddler 
Content-Type: x-www-form-urlencoded 
Host: example.com 
Content-Length: 73 

grant_type=password&[email protected]&password=examplePassword 

Ví dụ:

HTTP/1.1 200 OK 
Cache-Control: no-cache 
Pragma: no-cache 
Content-Type: application/json;charset=UTF-8 
Expires: -1 
Server: Microsoft-IIS/10.0 
X-Powered-By: ASP.NET 
Date: Tue, 16 Aug 2016 12:04:39 GMT 
{ 
    "access_token": "xxxx", 
    "token_type": "bearer", 
    "expires_in": 17999, 
    "refresh_token": "xxxx", 
    ".issued": "Tue, 16 Aug 2016 12:04:38 GMT", 
    ".expires": "Tue, 16 Aug 2016 17:04:38 GMT" 
} 

Chúng tôi hav e một ứng dụng góc sử dụng điểm cuối này để xác thực, và làm như vậy tốt.

Những gì chúng tôi đang cố gắng đạt được mà không cần nhiều thành công là tạo ứng dụng MVC sử dụng cùng một máy chủ để xác thực, chúng tôi muốn mã nằm trên đầu trang Identity 2.0 nếu có thể.

Trong AccountController (ví dụ dự án), chúng ta có phương pháp Login(LoginModel model) của chúng tôi mà xử lý đăng nhập và trông như thế này (giống như mẫu ví dụ dự án):

var result = await _signInManager.PasswordSignInAsync(model.UserName, model.Password, model.RememberMe, shouldLockout: false); 

Chúng tôi có implemention riêng của chúng ta về IUserStore, UserManager, SignInManager.

Tôi đã coi trọng

public Task<SignInStatus> PasswordSignInAsync(string userName, string password, bool isPersistent, bool shouldLockout) on `SignInManager<,>` and make a web call across to the security server. 

Việc thực hiện mặc định của PasswordSignInAsync cuộc gọi UserManager.FindByNameAsync tuy nhiên điều này sẽ có nghĩa là tôi sẽ phải phơi bày một phương pháp tra cứu trên máy chủ an ninh của tôi để xác nhận tên người dùng tồn tại mà thực sự không Nghe hay đấy.

Tôi phải thiếu điều gì đó và tôi biết nó sẽ không phức tạp, ứng dụng MVC của chúng tôi cần sử dụng xác thực cookie mà còn duy trì mã thông báo gấu cho các cuộc gọi tiếp theo đến máy chủ tài nguyên khác của chúng tôi.

(Tôi đánh giá cao tôi có thể đang trộn các công nghệ ở đây, do đó, câu hỏi).

Điều này cũng đang chạy trên OWIN.

+0

Bạn muốn ứng dụng MVC mới sử dụng Máy chủ xác thực hiện tại cho mã thông báo của nó? Nếu vậy, bạn mong muốn đạt được lợi thế gì? –

+0

Ứng dụng MVC của bạn không cần phải có bộ điều khiển Đăng nhập. Không phải ai cũng lấy người dùng và mật khẩu. Ứng dụng MVC của bạn nên xác thực và nhận được một AccessToken từ SecurityServer của bạn, và bạn nên giải mã mã thông báo này trên MVC. Điều này sẽ có thể nếu máy chủ chia sẻ một số thuộc tính. Đọc bài viết này để biết thêm thông tin: http://bitoftech.net/2014/09/24/decouple-owin-authorization-server-resource-server-oauth-2-0-web-api/ – Xavero

+0

Không chắc chắn liệu tôi có Có được câu hỏi của bạn đúng - * Những gì chúng tôi đang cố gắng đạt được mà không cần nhiều thành công là tạo một ứng dụng MVC sử dụng cùng một máy chủ để xác thực * - Aint nó có thể đạt được điểm cuối mã thông báo máy chủ bảo mật đó thông qua HttpClient từ hành động đăng nhập AccountController của bạn với tên người dùng và mật khẩu nào sẽ đặt mã thông báo trong cookie phản hồi nếu yêu cầu được xác thực? – Developer

Trả lời

2

Trong trường hợp này, tôi không nghĩ bạn nên sử dụng Identity 2.0 trong ứng dụng MVC của mình. Bạn nên tạo một AuthenticationClient để gọi máy chủ xác thực của bạn, bạn cũng có thể sử dụng thư viện này để xây dựng như một khách hàng https://www.nuget.org/packages/Thinktecture.IdentityModel.Client/

public class AuthenticationClient { 
    public ClaimsIdentity GetClaimsIdentity(string username, string password) { 
     //Call your authentication server to get your token and also claims associated with your identity. 
     //You can look at an example code how to do it: https://github.com/IdentityServer/IdentityServer3.Samples/blob/master/source/Clients/ConsoleResourceOwnerClient/Program.cs 
     //and create a ClaimsIdentity object out of those information 

     var identity = GetIdentity(); 

     //The key point here is to add AccessToken and RefreshToken as custom claims to your identity so you retrieve these tokens back on subsequent requests. 
     identity.AddClaim(new Claim("access_token", accessToken)); 
     identity.AddClaim(new Claim("refresh_token", refreshToken)); 
    } 
} 

này sẽ đáp ứng yêu cầu của bạn:

xác thực Sử dụng Cookie mà còn duy trì con gấu mã thông báo cho các cuộc gọi tiếp theo đến máy chủ tài nguyên khác của chúng tôi.

phương pháp Login của bạn trên AccountController nên như thế này:

public ActionResult Login(LoginModel model) 
{ 
    var identity = authenticationClient.GetClaimsIdentity(model.UserName, model.Password); 

    if (identity == null) { 
     return new HttpUnauthorizedResult(); 
    } 
    //Sign in the user 
    var ctx = Request.GetOwinContext(); 
    var authenticationManager = ctx.Authentication; 
    authenticationManager.SignIn(identity); 

    return new HttpStatusCodeResult(HttpStatusCode.OK); 
} 

tôi giả sử rằng bạn đã đăng ký middleware này để sử dụng xác thực Cookie:

public void ConfigureAuth(IAppBuilder app) 
{ 
    app.UseCookieAuthentication(new CookieAuthenticationOptions 
    { 
     AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
     LoginPath = new PathString("/Account/Login") 
    }); 
} 

Bây giờ cho tất cả các yêu cầu tiếp theo, bạn có thể truy xuất mã thông báo truy cập để gọi máy chủ tài nguyên của bạn từ ClaimsIdentity:

User.Identity.Claims.FirstOrDefault(x => x.Type == "access_token"); 
Các vấn đề liên quan