2017-10-05 91 views
0

我认为问题标题不言自明,也许只是一个精确的时候,当我说“他或她正在浏览”时,我正在考虑传播或信号。如何让任何视图知道用户角色(ASP.NET MVC身份)已更改,以强制任何用户在他或她浏览时注销?

我不希望他或她必须浏览另一个地方,只是想知道身份SecurityStamp已更改并已登出然后重定向到主页,我已经这样做了,但我已经想知道是否有框架(我怀疑最有可能是JS)会使操作更“实时”一点。

[编辑]
可能是SignalR的工作,我还没有尝试过。

+0

是的,SignalR将是更好的选择。 – DSR

+0

不确定你的负载需求,或者你想如何“实时”,但是一个简单的调查也可以工作 – Shoe

回答

0

我得到了一个有效的解决方案与SignalR

首先,支付顺序注意其中SignalR是在Startup.Auth.csHow to send message via SignalR to a specific User(Identity Id)?设置,也创造IUserIdProvider的实现,将是registred后,才Cookies和OwinContext,以使其能够利用身份用户字段(即非空)。

public partial class Startup 
{ 
    public void ConfigureAuth(IAppBuilder appBuilder) 
    { 
     // Order matters here... 
     // Otherwise SignalR won't get Identity User information passed to Id Provider... 
     ConfigOwinContext(appBuilder); 
     ConfigCookies(appBuilder); 
     ConfigSignalR(appBuilder); 
    } 

    private static void ConfigOwinContext(IAppBuilder appBuilder) 
    { 
     appBuilder.CreatePerOwinContext(ApplicationDbContext.Create); 
     appBuilder.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create); 
     appBuilder.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create); 
     appBuilder.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create); 
     appBuilder.CreatePerOwinContext(LdapAdEmailAuthenticator.Create); 
    } 

    private static void ConfigCookies(IAppBuilder appBuilder) 
    { 
     appBuilder.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
      LoginPath = new PathString("/Account/Login"), 
      Provider = new CookieAuthenticationProvider 
      { 
       OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser> 
       (
        TimeSpan.FromHours(4), 
        (manager, user) => user.GenerateUserIdentityAsync(manager) 
       ) 
      } 
     }); 
     appBuilder.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); 
     appBuilder.UseTwoFactorSignInCookie(DefaultAuthenticationTypes.TwoFactorCookie, TimeSpan.FromMinutes(5)); 
     appBuilder.UseTwoFactorRememberBrowserCookie(DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie); 
    } 

    private static void ConfigSignalR(IAppBuilder appBuilder) 
    { 
     appBuilder.MapSignalR(); 
     var idProvider = new HubIdentityUserIdProvider(); 
     GlobalHost.DependencyResolver.Register(typeof(IUserIdProvider),() => idProvider); 
    } 
} 

public class HubIdentityUserIdProvider : IUserIdProvider 
{ 
    public string GetUserId(IRequest request) 
    { 
     return request == null 
      ? throw new ArgumentNullException(nameof(request)) 
      : request.User?.Identity?.GetUserId(); 
    } 
} 

其次,声明一个轮毂上的服务器侧

public class UserHub : Hub 
{ 
} 

第三,在控制器(API或不),其中的变化,其涉及特定用户的一个注销,强制signout +身份securitystamp的更新:

var userHub = GlobalHost.ConnectionManager.GetHubContext<UserHub>(); 
userHub.Clients.User(userId).send("Roles added: " + rolesToAdd.Join() + Environment.NewLine + "Roles removed: " + rolesToRemove.Join()); 

return Request.CreateResponse(HttpStatusCode.OK); 

第四,使用轮毂上JS客户端,我创建LoggedOutPartialView.cshtml当当前用户被认证其仅使用的,局部视图:

@if (Request.IsAuthenticated) 
{ 
    <div class="modal fade" id="loggedOutModal" tabindex="-1" role="dialog" aria-labelledby="loggedOutModalLabel"> 
     <div class="modal-dialog" role="document"> 
      <div class="modal-content"> 
       <div class="modal-header"> 
        <h4 class="modal-title" id="loggedOutModalLabel">Notification</h4> 
       </div> 
       <div class="modal-body"> 
        <h6 class="align-center">Sorry, but it seems that you just have been logged out!!!</h6> 
       </div> 
       <div class="modal-footer"> 
        <button type="button" class="btn btn-default" data-dismiss="modal">Close</button> 
       </div> 
      </div> 
     </div> 
    </div> 

    <script> 

     $(function() { 
      var userHub = $.connection.userHub; 

      console.log(userHub.client); 

      userHub.client.logout= function (message) { 
       $('#loggedOutModal').modal('show'); 
      }; 

      $.connection.hub.start().done(function() { 
      }); 
     }); 

    </script> 
} 
相关问题