ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ABP模拟登录ImpersonatorUserId

2020-11-10 15:33:16  阅读:208  来源: 互联网

标签:AbpSession 登录 ViewBag await Value ABP ImpersonatorUserId user var


展示前端

header.cshtml

@{
    Layout = null;
    long? moni = ViewBag.moni;
}
@model HF.Template.UserManagerment.Users.Dtos.UserEditDto

@*<link rel="stylesheet" href="/PortalSite/Content/portalsite/css/head.css">*@
@*<link rel="stylesheet" href="/PortalSite/Content/portalsite/css/head-footer.css">*@
<link href="https://tvupt.oss-cn-beijing.aliyuncs.com//PortalSite/Content/portalsite/newcss/css/header_footer.css" rel="stylesheet" />
<style>
   .phone {
        background: url(/PortalSite/Content/portalsite/newcss/img/phone.png) no-repeat;
        background-position: left center;
        font-size: 16px;
        color: #646368;
        padding-left: 14px;
        color: #1a6bc9 !important;
    }
    .phs{position:relative}
    .imt{
        position:absolute;
        top:20px;
        left:-45px
    }
    .phs .imt {
        display: none
    }

    .imt {
        background: url(/PortalSite/Content/portalsite/img/dt.png) no-repeat;
        background-size: 100% 100%;
        width: 170px;
        height: 200px;
        text-align: center;
        z-index: 100;
    }

        .imt > img {
            width: 100px;
            height: 100px;
            margin-top: 26px;
        }

    .phs:hover .imt {
        display: block;
    }

    
</style>
<div class="header">
    @if (Model == null)
    {

        <div class="midHearder clearfix">
            <span class="leftHeader">
               @(DateTime.Now.ToString("yyyy年MM月dd日"))
                <span class="midList">您是第<span class="redList">@ViewBag.re</span>位访客!
                </span>@*在线用户<span class="redList">@ViewBag.li</span>人*@
            </span>
            <div class="rightHeader">
                <ul>
                    <li><a onclick="parent.location.href='/Account/SignIn'" href="javascript:;">登录</a></li>
                    <li>
                        <a onclick="parent.location.href='/Account/RegisterUser'" href="javascript:;">学员注册</a>&nbsp;|
                        <a onclick="parent.location.href='/Account/RegisterUser?type=2'" href="javascript:;">集体注册</a>
                    </li>
                    <li> <a onclick="parent.location.href='/Account/PassWordBack'" href="javascript:;">找回密码</a></li>
                    <li class="phs">
                        <a class="phone"  href="javascript:;">手机版</a>
                        <div class="imt">

                            <img src="~/PortalSite/Content/portalsite/img/mobilecode.png" />
                            <div style="margin:0px; padding:0px;line-height:20px">扫一扫</div>
                            <span style="margin:0px; padding:0px;line-height:20px">登录手机版</span>
                        </div>
                    </li>
                    @*<li><a href="loginRegister/signin.html">[退出]</a></li>*@
                </ul>
            </div>
        </div>
    }
    else if (Model.UserType == 1)
    {

        <div class="midHearder clearfix">
            <span class="leftHeader">
                @(DateTime.Now.ToString("yyyy年MM月dd日"))
                <span class="midList">
                    您是第<span class="redList">@ViewBag.re</span>位访客!
                </span> @*在线用户<span class="redList">@ViewBag.li</span>人*@
            </span>
            <div class="rightHeader">
                <ul>
                    <li>@ViewBag.person.Surname</li>
                    <li>
                        <a onclick="parent.location.href='/Train/Training'" href="javascript:;">我要报名</a>
                    </li>
                    <li><a onclick="parent.location.href='/PersonCenter/MyPersonalCenter'" href="javascript:;">进入学习中心</a></li>
                    @if (moni.HasValue && moni.Value > 0)
                    {
                        <li><a onclick="parent.location.href='/Account/SkipImpersonatorUser'" href="javascript:;">返回后台</a></li>
                    }
                    <li><a onclick="parent.location.href='/Account/Logout'" href="javascript:;">【退出】</a></li>
                    <li class="phs">
                        <a class="phone" href="javascript:;">手机版</a>
                        <div class="imt">

                            <img src="~/PortalSite/Content/portalsite/img/mobilecode.png" />
                            <div style="margin:0px; padding:0px;line-height:20px">扫一扫</div>
                            <span style="margin:0px; padding:0px;line-height:20px">登录手机版</span>
                        </div>
                    </li>
                </ul>
            </div>
        </div>

    }
    else if (Model.UserType == 2)
    {

        <div class="midHearder clearfix">
            <span class="leftHeader">
                @(DateTime.Now.ToString("yyyy年MM月dd日"))
                <span class="midList">
                    您是第<span class="redList">@ViewBag.re</span>位访客!
                </span>@*在线用户<span class="redList">@ViewBag.li</span>人*@
            </span>
            <div class="rightHeader">
                <ul>
                    <li>@ViewBag.company.CompanyName</li>
                    <li>
                        <a onclick="parent.location.href='/CompanyCenter/Apply'" href="javascript:;">我要报名</a>
                    </li>
                    <li><a onclick="parent.location.href='/CompanyCenter/TeamObligation'" href="javascript:;">进入管理中心</a></li>
                    @if (moni.HasValue && moni.Value > 0)
                    {
                        <li><a onclick="parent.location.href='/Account/SkipImpersonatorUser'" href="javascript:;">返回后台</a></li>
                    }
                    <li><a onclick="parent.location.href='/Account/Logout'" href="javascript:;">【退出】</a></li>
                    <li class="phs">
                        <a class="phone" href="javascript:;">手机版</a>
                        <div class="imt">

                            <img src="~/PortalSite/Content/portalsite/img/mobilecode.png" />
                            <div style="margin:0px; padding:0px;line-height:20px">扫一扫</div>
                            <span style="margin:0px; padding:0px;line-height:20px">登录手机版</span>
                        </div>
                    </li>
                </ul>
            </div>
        </div>
    }
    else 
    {

        <div class="midHearder clearfix">
            <span class="leftHeader">
                @(DateTime.Now.ToString("yyyy年MM月dd日"))
                <span class="midList">
                    您是第<span class="redList">@ViewBag.re</span>位访客!
                </span>@*在线用户<span class="redList">@ViewBag.li</span>人*@
            </span>
            <div class="rightHeader">
                <ul>
                    <li><a onclick="parent.location.href='/Account/SignIn'" href="javascript:;">登录</a></li>
                    <li>
                        <a onclick="parent.location.href='/Account/RegisterUser'" href="javascript:;">学员注册</a>&nbsp;|
                        <a onclick="parent.location.href='/Account/RegisterUser?type=2'" href="javascript:;">集体注册</a>
                    </li>
                    <li> <a onclick="parent.location.href='/Account/PassWordBack'" href="javascript:;">找回密码</a></li>
                    <li><a onclick="parent.location.href='/Account/SkipImpersonatorUser'" href="javascript:;">返回后台</a></li>
                    <li class="phs">
                        <a class="phone" href="javascript:;">手机版</a>
                        <div class="imt">

                            <img src="~/PortalSite/Content/portalsite/img/mobilecode.png" />
                            <div style="margin:0px; padding:0px;line-height:20px">扫一扫</div>
                            <span style="margin:0px; padding:0px;line-height:20px">登录手机版</span>
                        </div>
                    </li>
                </ul>
            </div>
        </div>
    }
</div>
<div class="logoLine">
    <div class="midHearder clearfix">
        <a href="#" class="leftLogo">
            <img src="https://tvupt.oss-cn-beijing.aliyuncs.com//PortalSite/Content/portalsite/newcss/img/logo.jpg" alt="">
        </a>
        <div class="rightTel">
            <p class="logo">咨询电话 <span class="listLogo">0315-2020187或2059305</span></p>
            <p class="tel">3047785784@qq.com</p>
        </div>
    </div>
</div>

展示后台

        /// <summary>
        /// 布局头部
        /// </summary>
        /// <returns></returns>      
        public ActionResult header()
        {
            var c = _userAppService.GetHomeCount();

            ViewBag.re = c.Item1;

            ViewBag.li = c.Item2;
            PersonEditDto personEditDto = null;
            CompanyEditDto companyEditDto = null;
            var UserId = AbpSession.UserId;
            ViewBag.moni = AbpSession.ImpersonatorUserId;
            UserEditDto usero = null;
            if (UserId.HasValue && UserId > 0)
            {
                 usero = _userAppService.GetUserById(AbpSession.UserId.Value);


                if (usero.UserType == 1)
                {
                    var user = _userAppService.GetOrdinaryUserInfo((int)AbpSession.UserId.Value);
                    personEditDto = user;
                }
                else if (usero.UserType == 2)
                {
                    var company = _userAppService.GetCompanyUserInfo((int)AbpSession.UserId.Value);
                    companyEditDto = company;
                }
            }
            ViewBag.person = personEditDto;
            ViewBag.company = companyEditDto;
            return View(usero);
        }

登录前端

登录后端

        #region Impersonation

        [AbpMvcAuthorize(PermissionNames.Pages_Users_Company_Impersonation)]
        public Task<JsonResult> CompanyImpersonate(ImpersonateModel model) { return Impersonate(model); }

        [AbpMvcAuthorize(PermissionNames.Pages_Users_Ordinary_Impersonation)]
        public Task<JsonResult> OrdinaryImpersonate(ImpersonateModel model) { return Impersonate(model); }

        public virtual async Task<JsonResult> Impersonate(ImpersonateModel model)
        {
            CheckModelState();

            if (AbpSession.ImpersonatorUserId.HasValue)
            {
                throw new CustomeFriendlyException(L("CascadeImpersonationErrorMessage"));
            }

            if (AbpSession.TenantId.HasValue)
            {
                if (!model.TenantId.HasValue)
                {
                    throw new CustomeFriendlyException(L("FromTenantToHostImpersonationErrorMessage"));
                }

                if (model.TenantId.Value != AbpSession.TenantId.Value)
                {
                    throw new CustomeFriendlyException(L("DifferentTenantImpersonationErrorMessage"));
                }
            }

            var result = await SaveImpersonationTokenAndGetTargetUrl(model.TenantId, model.UserId, false);
          //  AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
            return result;
        }

        [UnitOfWork]
        public virtual async Task<ActionResult> ImpersonateSignIn(string tokenId)
        {
            var cacheItem = await _cacheManager.GetImpersonationCache().GetOrDefaultAsync(tokenId);
            if (cacheItem == null)
            {
                throw new CustomeFriendlyException(L("ImpersonationTokenErrorMessage"));
            }

            //Switch to requested tenant   去掉过滤 宿主需要模拟登陆其他租户的用户
            // using (_unitOfWorkManager.Current.SetFilterParameter(AbpDataFilters.MayHaveTenant, AbpDataFilters.Parameters.TenantId, cacheItem.TargetTenantId))
            using (_unitOfWorkManager.Current.DisableFilter(AbpDataFilters.MayHaveTenant))
            {
                //Get the user from tenant
                var user = await _userManager.FindByIdAsync(cacheItem.TargetUserId);

                //Create identity
                //var identity = await _userManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);

                // var identity = await _userManager.CreateIdentityAsync(user,"Bearer");


                var identity = await _userManager.CreateIdentityAsync(user, "Bearer");

                if (!cacheItem.IsBackToImpersonator)
                {
                    //Add claims for audit logging
                    if (cacheItem.ImpersonatorTenantId.HasValue)
                    {
                        identity.AddClaim(new Claim(AbpClaimTypes.ImpersonatorTenantId, cacheItem.ImpersonatorTenantId.Value.ToString(CultureInfo.InvariantCulture)));
                    }

                    identity.AddClaim(new Claim(AbpClaimTypes.ImpersonatorUserId, cacheItem.ImpersonatorUserId.ToString(CultureInfo.InvariantCulture)));
                }
                await SignInAsync(user, identity);
               
                
                //Sign in with the target user
                user.Online = 1;
                //AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
                //AuthenticationManager.SignIn(new AuthenticationProperties { IsPersistent = false }, identity);


                //var accessToken = CreateAccessToken(await CreateJwtClaims(identity, user));

              //  System.Web.HttpContext.Current.Response.Cookies.Add(new System.Web.HttpCookie("webToken") { Path = "/", Name = "webToken", Value = accessToken });



                //Remove the cache item to prevent re-use
                await _cacheManager.GetImpersonationCache().RemoveAsync(tokenId);
                if (user.UserType == 0)
                {
                    return Redirect("/Admin");// 跳转后台
                }
                else
                {
                    if (System.Configuration.ConfigurationManager.AppSettings["debug"] == "0")
                    {
                        var tenantId = user.TenantId;
                        var caton = _cantonAppService.GetBindCantonByTenantId(tenantId);
                        return Redirect("http://" + caton.SubURL + "." + System.Configuration.ConfigurationManager.AppSettings["ym"]);//修改 李飞行 跳转首页
                    }else
                    {
                        return Redirect("/");// 跳转首页
                    }
                }
                //return RedirectToAction();
            }
        }

        //public virtual JsonResult IsImpersonatedLogin()
        //{
        //    return Json(new AjaxResponse { Result = AbpSession.ImpersonatorUserId.HasValue });
        //}

        //public virtual async Task<JsonResult> BackToImpersonator()
        //{
        //    if (!AbpSession.ImpersonatorUserId.HasValue)
        //    {
        //        throw new CustomeFriendlyException(L("NotImpersonatedLoginErrorMessage"));
        //    }

        //    var result = await SaveImpersonationTokenAndGetTargetUrl(AbpSession.ImpersonatorTenantId, AbpSession.ImpersonatorUserId.Value, true);
        //    AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
        //    return result;
        //}

        private async Task<JsonResult> SaveImpersonationTokenAndGetTargetUrl(int? tenantId, long userId, bool isBackToImpersonator)
        {
            //Create a cache item
            var cacheItem = new ImpersonationCacheItem(
                tenantId,
                userId,
                isBackToImpersonator
                );

            if (!isBackToImpersonator)
            {
                cacheItem.ImpersonatorTenantId = AbpSession.TenantId;
                cacheItem.ImpersonatorUserId = AbpSession.GetUserId();
            }

            //Create a random token and save to the cache
            var tokenId = Guid.NewGuid().ToString();
            await _cacheManager
                .GetImpersonationCache()
                .SetAsync(tokenId, cacheItem, TimeSpan.FromMinutes(1));

            //Find tenancy name
            string tenancyName = null;
            if (tenantId.HasValue)
            {
                tenancyName = (await _tenantManager.GetByIdAsync(tenantId.Value)).TenancyName;
            }

            //Create target URL
            var targetUrl = _webUrlService.GetSiteRootAddress(tenancyName) + "Account/ImpersonateSignIn?tokenId=" + tokenId;
            return Json(new AjaxResponse { TargetUrl = targetUrl });
        }

        #endregion

 public async Task<ActionResult> SkipImpersonatorUser() {
            using (_unitOfWorkManager.Current.DisableFilter(AbpDataFilters.MayHaveTenant))
            {
                if (AbpSession.ImpersonatorUserId.HasValue && AbpSession.ImpersonatorUserId.Value > 0)
                {
                    var user = await _userManager.FindByIdAsync(AbpSession.ImpersonatorUserId.Value);

                    await SignInAsync(user);

                    //Create identity
                    // var identity = await _userManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);
                    // AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
                    user.Online = 1;
                    //AuthenticationManager.SignIn(new AuthenticationProperties { IsPersistent = false }, identity);
                }

                return Redirect("/Admin");
            }
        }

 

标签:AbpSession,登录,ViewBag,await,Value,ABP,ImpersonatorUserId,user,var
来源: https://www.cnblogs.com/wangyinlon/p/13954048.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有