2011-11-09 41 views
6

Tôi không phải là chuyên gia SharePoint theo bất kỳ cách nào và tôi đã có một thời gian thực sự khó tìm thông tin phù hợp về điều này. Xin giúp tôi!Tính lại các xác nhận quyền sở hữu cho người dùng SharePoint 2010 trong khi người dùng vẫn đăng nhập

Tôi cần một cách để tạo mã thông báo xác nhận quyền sở hữu được thiết lập với một cuộc gọi đến SPFederationAuthenticationModule.SetPrincipalAndWriteSessionToken để tính lại các xác nhận quyền sở hữu trên mã thông báo mà không cần đăng xuất người dùng hiện tại. Có cách nào để làm điều này không?

Một số nền tảng về lý do tại sao tôi yêu cầu này:

Chúng tôi sử dụng một vai trò & cung cấp thành viên tùy chỉnh cho authN/Z trên ứng dụng web tùy chỉnh SharePoint 2010 của chúng tôi. Không đi vào chi tiết về lý do tại sao (phức tạp) nhà cung cấp vai trò tạo ra tên vai trò được tạo động cho người dùng dựa trên trạng thái của người dùng trong cơ sở dữ liệu ứng dụng chính; các vai trò này đại diện cho quyền cho người dùng và được sử dụng bên trong SharePoint để xác định quyền truy cập của người dùng vào các trang web và tuyển tập site trong ứng dụng.

Có nhiều cách trong ứng dụng của chúng tôi để người dùng thay đổi quyền của họ, bổ sung hiệu quả vai trò mới thông qua nhà cung cấp vai trò, cấp cho người dùng quyền truy cập bổ sung trong ứng dụng. Vấn đề chúng tôi đang gặp phải là xác nhận quyền sở hữu dựa trên xác nhận quyền sở hữu mà chúng tôi buộc phải sử dụng trong SP2010 tính trước các quyền khi đăng nhập và mã hóa các quyền đó trong mã thông báo phiên - hiệu quả buộc chúng tôi yêu cầu người dùng đăng xuất và đăng nhập lại trước khi họ có thể có được quyền mới của họ. Điều này đang tạo ra tất cả các loại vấn đề khả năng sử dụng, do đó câu hỏi của tôi.

Có cách nào để lập trình lại mã thông báo phiên mà không cần đăng xuất người dùng không?

Hoặc chúng ta đang sủa cây sai? Trong vùng đất ASP.NET hạnh phúc bình thường của tôi, tôi sẽ sử dụng biểu mẫu Auth, tính toán ủy quyền ở mọi yêu cầu thay vì đăng nhập. Thật không may, đó dường như không phải là một tùy chọn trong SP2010, và tôi khá mắc kẹt với SharePoint tại thời điểm này. Có một số hành động khác mà chúng ta có thể theo đuổi không?

+0

không chắc chắn rằng tôi hiểu vấn đề - từ những gì tôi thu thập theo http://msdn.microsoft.com/en-us/library/ee557572.aspx này bạn có thể tính toán lại các xác nhận quyền sở hữu bằng cách tạo một SecurityToken mới (cùng một người dùng/pw - ID khác nhau) ... đây là những gì bạn đang sau? nếu không xin vui lòng xây dựng ... – Yahia

+0

@ Yahia Vâng, đây chính xác là những gì tôi theo sau.Nhưng việc khởi tạo SecurityToken yêu cầu mật khẩu của người dùng - điều mà tôi không chỉ nói dối. Tôi có thể hỏi người dùng về mật khẩu của họ, nhưng điều đó tương đương với việc đăng xuất và đăng nhập lại. Tôi có thể giữ mật khẩu trong phiên, nhưng điều đó sẽ không an toàn. Có phải là một cách để làm điều này mà không cần mật khẩu. – Randolpho

+0

Bạn đã kiểm tra vào 'RenewToken' (xem http://msdn.microsoft.com/en-us/library/ms551886.aspx), sau đó là một cuộc gọi đến' ValidateToken'? NẾU điều đó không làm những gì bạn cần tôi nghi ngờ bạn sẽ phải viết riêng của bạn SecurityToken tùy chỉnh/nhà cung cấp vv hoặc giữ PW xung quanh trong bộ nhớ (mà tôi đồng ý là không tốt!). – Yahia

Trả lời

5

Ok, sau nhiều nghiên cứu thúc đẩy bởi @ liên kết Yahia, tôi đã khám phá ra câu trả lời cho vấn đề của tôi trong a blog post. Làm việc như người ở. Tôi sẽ cung cấp tổng quan bên dưới, trong trường hợp liên kết bị ngắt:

Windows Identify Foundation's SessionAuthenticationModule, được sử dụng làm khuôn khổ auth SharePoint 2010, có một sự kiện nhỏ gọn mà bạn có thể móc gọi là SessionSecurityTokenReceived, được gọi là bắt đầu mọi yêu cầu. Bằng cách gắn kết sự kiện này, tôi có thể buộc SharePoint yêu cầu gia hạn ủy quyền mà không buộc người dùng phải nhập lại thông tin đăng nhập.

Mã này là đơn giản và ngọt ngào:

var sam = sender as SessionAuthenticationModule; 
var logonWindow = SPSecurityTokenServiceManager.Local.LogonTokenCacheExpirationWindow; 
var newValidTo = DateTime.UtcNow.Add(logonWindow); 
e.SessionToken = sam.CreateSessionSecurityToken(
    e.SessionToken.ClaimsPrincipal, 
    e.SessionToken.Context, 
    e.SessionToken.ValidFrom, 
    newValidTo, 
    e.SessionToken.IsPersistent); 
e.ReissueCookie = true; 

Tôi đã thử nghiệm nó, và cách tiếp cận chắc chắn công trình, nhưng có nhược điểm:

  1. Các cuộc gọi đến CreateSessionToken nhu cầu dữ liệu hiện có từ mã thông báo phiên hiện tại, nó xuất hiện mà tôi chỉ có thể nhận được từ sự kiện. Điều đó có nghĩa phương pháp này chỉ có thể được thực hiện trong bối cảnh yêu cầu mới. Vì sự kiện này kích hoạt mọi yêu cầu và tôi chỉ muốn làm mới auth trong một số trường hợp nhất định, tôi buộc phải kiểm tra mọi yêu cầu để được nhắc làm mới auth. Cách tiếp cận đơn giản nhất là tạo một URL ảo, chẳng hạn như "/ refreshToken? RedirectUrl = {url}" mà bạn kiểm tra trong trình xử lý sự kiện. Chỉ cần chuyển hướng đến URL này khi xác thực đã được cập nhật và mã thông báo cần được làm mới.
  2. Hooking sự kiện là có vấn đề - bạn không thể làm điều đó tĩnh bởi vì mô-đun không tồn tại khi xây dựng tĩnh được xây dựng. Cuối cùng, tốt nhất bạn nên thực hiện nó theo tùy chỉnh HttpModule hoặc global.asax - cả hai đều yêu cầu cập nhật tài nguyên không thể chạm vào thông qua triển khai .WSP tệp (web.config hoặc tệp global.asax). triển khai đầu tiên. Tôi đã chọn để đi theo tuyến đường global.asax.

Tóm lại, một sự thỏa mãn. Đã hoàn thành công việc, với một giải pháp tối thiểu.

+0

Tôi đã sử dụng câu trả lời này để trả lời http://sharepoint.stackexchange.com/questions/75675/sts-token-lifetime-for-external-claims-eg-azure-acs/76168#76168 - Tôi tham chiếu nó ở đây vì mã là hơi khó khăn hơn, và tôi đã có một trường hợp sử dụng khác, nhưng ai đó có thể thấy hữu ích khi hiểu câu trả lời của bạn. –

2

Tôi thấy một vài khả năng:

  • thử sử dụng SPRoleAssignmentSPGroupCollection trên respecitve SPUser để thêm nhóm/vai trò động

  • sử dụng RenewToken tiếp theo ValidateToken
    Cho dù điều này thực sự làm những gì bạn muốn phụ thuộc vào cách bộ nhớ đệm được triển khai (nghĩa là việc gia hạn/xác thực lần lượt làm mất hiệu lực các Xác nhận quyền sở hữu đã lưu trong bộ nhớ cache)

  • giữ mật khẩu trong bộ nhớ, tạo mã thông báo mới (với cùng một người dùng/pw, nhưng ID mới!) Rồi gọi ValidateToken
    Tôi nghĩ đây là tùy chọn dễ nhất NHƯNG cùng một cơn ác mộng về bảo mật (tức là thực hành xấu)!

  • gọi Authenticate bất cứ khi nào bạn muốn kiểm tra cho một tuyên bố
    Cho dù công trình này phụ thuộc vào nhà cung cấp tuỳ chỉnh của bạn ... nếu nó hoạt động nó sẽ chi phí hoạt động mặc dù ...

  • thực hiện của bạn custom SecurityToken (và providerand ...)
    Điều này sẽ làm những gì bạn muốn nhưng có nghĩa là lots of work.

tài nguyên hữu ích khác bao gồm:

+0

Cảm ơn bạn rất nhiều vì đã trả lời. Tôi sẽ điều tra các đề xuất của bạn và cho bạn biết những gì tôi tìm ra. – Randolpho

+0

Ok, sau nhiều nghiên cứu được một số liên kết của bạn đưa ra, tôi đã tìm thấy câu trả lời. Không có đề xuất nào của bạn làm việc, vì vậy tôi không chấp nhận câu trả lời của bạn, nhưng tôi sẽ cung cấp cho bạn tiền thưởng của tôi để được giúp đỡ của bạn. Tôi đánh giá rất cao nó. Tôi sẽ đăng bài như thế nào tôi giải quyết vấn đề trong một câu trả lời riêng biệt. – Randolpho

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