Có một vài điều bạn cần làm. Tạo ứng dụng khách OAuth sẽ thực hiện yêu cầu mã thông báo và sử dụng để nhận mã thông báo truy cập từ máy chủ nhận dạng cho phép bạn truy cập vào các điểm cuối api trên web của mình. Để thực hiện điều này, ứng dụng khách OAuth của bạn cần phải bật luồng ngầm. Sau đó bạn thực hiện yêu cầu đăng nhập vào máy chủ Identity, thường thông qua cửa sổ bật lên để cho phép ứng dụng OAuth của bạn đăng nhập. Bạn cần chuyển chi tiết khách hàng OAuth của mình vào chuỗi truy vấn của yêu cầu đăng nhập Idsrv, cấu hình ứng dụng khách OAuth sẽ là những gì bạn đã định nghĩa trong bảng quản trị Idsrv của bạn cho khách hàng OAuth, bạn sẽ parameterize đó và gắn nó vào url OAuth2/authorzie:
getIdpOauthEndpointUrl: function() {
return "https://192.168.1.9/issue/oauth2/authorize";
},
getOAuthConfig: function() {
return {
client_id: "Your Oauth CLient ID that you specifie din Identity Server",
scope: "The scope of your RP",
response_type: "token",
redirect_uri: "https://..YourAngularAppUrl/AuthCallback.html"
};
}
sau đó bạn mở cửa sổ đăng nhập:
var url = authService.getIdpOauthEndpointUrl() + "?" + $.param(authService.getOAuthConfig());
window.open(url, "Login", "height=500,width=350");
Trong ứng dụng khách OAuth của bạn trongIdsrv, bạn cần chỉ định URL chuyển hướng, trong trường hợp của chúng tôi:
https://YourAngularAppUrl/AuthCallback.html
đó là những gì bạn chuyển vào yêu cầu đăng nhập vào máy chủ nhận dạng cùng với chi tiết khách hàng OAuth của bạn. Trang AuthCallback.html
không có gì ngoài việc trích xuất mã thông báo truy cập được trả về bởi idsrv đến trang đó trong chuỗi truy vấn và chuyển nó vào ứng dụng góc của bạn, cách bạn thực hiện điều đó tùy thuộc vào bạn, nhưng mã thông báo truy cập đó cần được đưa vào tiêu đề $http
của bạn .
Các access token có thể được chiết xuất trong trang AuthCallback.html của bạn như thế này:
<script src="/Scripts/jquery-2.0.3.js"></script>
<script src="/Scripts/jquery.ba-bbq.min.js"></script>
<script type="text/javascript">
var params = $.deparam.fragment(location.hash.substring(1));
window.opener.oAuthCallback(params);
window.close();
</script>
chức năng OAuthCallback
được định nghĩa trong trang vỏ của tôi, index.html của tôi và có trách nhiệm đi qua các dấu hiệu nó đưa vào ứng dụng góc cạnh của tôi và đặt nó vào các tiêu đề $http
.
function oAuthCallback(OAUTHTOKEN) {
angular.element(window.document).scope().setHttpAuthHeaderAndAuthenticate(OAUTHTOKEN);
}
Chức năng setHttpAuthHeaderAndAuthenticate()
được định nghĩa trên $rootScope
của tôi, và nó đặt mã thông báo vào các tiêu đề $http
authorizaiton:
$http.defaults.headers.common.Authorization = 'Bearer ' + OAUTHTOKEN["access_token"];
Có một cái nhìn tại this post Christian Weyer Nó thực hiện chính xác những gì chúng tôi đang làm, nhưng đó là một ứng dụng knockout/web-api, cùng một khái niệm vẫn còn.
Bước tiếp theo là yêu cầu api web của bạn chấp nhận mã thông báo truy cập từ idsrv, điều này rất đơn giản;
public static void Configure(HttpConfiguration config)
{
var authConfig = new AuthenticationConfiguration();
authConfig.AddJsonWebToken(
YourIdsrvSiteId, YourRpsScope/Relam,YourRpsSymmetricSigningKey
);
config.MessageHandlers.Add(new AuthenticationHandler(authNConfig));
}
Bạn cũng có thể xác định một ClaimsAuthenticationManager và ClaimsAuthorizationManager đây để cho phép bạn chuyển đổi các yêu cầu và Grant/Deny acces sto các tài nguyên web api. Một lần nữa, điều này được đề cập trong bài đăng của Christian Weyer. Hi vọng điêu nay co ich.
Yea này cũng hoạt động, giải pháp tôi đưa ra tuy nhiên là phù hợp hơn nếu bạn muốn SSO. –
Cảm ơn bạn đã gửi bài giải pháp của bạn. Điều này đã giúp tôi allot !! Nó cũng đăng nhập tốt đẹp thông qua một proxy thay vì chuyển hướng đến Idsrv. Một lần nữa, cảm ơn bạn. – StefanHa
Rất vui được giúp bạn! – cdiazal