首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过远程服务和关于TokenAuthController的登录用户

通过远程服务和关于TokenAuthController的登录用户
EN

Stack Overflow用户
提问于 2019-03-25 13:07:04
回答 1查看 509关注 0票数 0

我需要登录-只使用远程服务的用户。我认为在TokenAuthController应用程序中使用Web.Core

我真的不明白为什么下面给出的片段不能工作。我在TokenAuthController中添加了一个名为Login的新方法。

代码语言:javascript
运行
复制
using System;
using System.Collections.Generic;
using System.IdentityModel.Tokens.Jwt;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Abp.Authorization;
using Abp.Authorization.Users;
using Abp.MultiTenancy;
using Abp.Runtime.Security;
using Abp.UI;
using Abp.Web.Models;
using Microsoft.AspNetCore.Authorization;
using TSE.DergiAbone.Authentication.External;
using TSE.DergiAbone.Authentication.JwtBearer;
using TSE.DergiAbone.Authorization;
using TSE.DergiAbone.Authorization.Users;
using TSE.DergiAbone.Identity;
using TSE.DergiAbone.Models.TokenAuth;
using TSE.DergiAbone.MultiTenancy;

namespace TSE.DergiAbone.Controllers
{
    [Route("api/[controller]/[action]")]
    public class TokenAuthController : DergiAboneControllerBase
    {
        private readonly LogInManager _logInManager;
        private readonly SignInManager _signInManager;

        private readonly ITenantCache _tenantCache;
        private readonly AbpLoginResultTypeHelper _abpLoginResultTypeHelper;
        private readonly TokenAuthConfiguration _configuration;
        private readonly IExternalAuthConfiguration _externalAuthConfiguration;
        private readonly IExternalAuthManager _externalAuthManager;
        private readonly UserRegistrationManager _userRegistrationManager;

        public TokenAuthController(
            LogInManager logInManager,
            SignInManager signInManager,
            ITenantCache tenantCache,
            AbpLoginResultTypeHelper abpLoginResultTypeHelper,
            TokenAuthConfiguration configuration,
            IExternalAuthConfiguration externalAuthConfiguration,
            IExternalAuthManager externalAuthManager,
            UserRegistrationManager userRegistrationManager)
        {
            _logInManager = logInManager;
            _tenantCache = tenantCache;
            _abpLoginResultTypeHelper = abpLoginResultTypeHelper;
            _configuration = configuration;
            _externalAuthConfiguration = externalAuthConfiguration;
            _externalAuthManager = externalAuthManager;
            _userRegistrationManager = userRegistrationManager;
            _signInManager = signInManager;
        }
        ***[HttpPost]
        public virtual async Task<JsonResult> Login(string UserName, string password,bool IsPersistent )
        {

            var loginResult = await GetLoginResultAsync(UserName, password, GetTenancyNameOrNull());

            //var result = await _signInManager.SignInAsync(loginResult.Identity, IsPersistent);
            var result = await _signInManager.PasswordSignInAsync(UserName, password, true, false);
            if (result.Succeeded)
           {
              long bak= User.Identity.GetUserId().Value;
                string res = "User signed in";
           }
            await UnitOfWorkManager.Current.SaveChangesAsync();
            bool chk = User.Identity.IsAuthenticated;
            return Json(new Abp.Web.Models.AjaxResponse { TargetUrl = "" });
        }***







        [HttpPost]
        public async Task<AuthenticateResultModel> Authenticate([FromBody] AuthenticateModel model)
        {
            var loginResult = await GetLoginResultAsync(
                model.UserNameOrEmailAddress,
                model.Password,
                GetTenancyNameOrNull()
            );




            //var chk = _logInManager.LoginAsync("jimycarbonare@gmail.com", "123qwe", "TSEDergi").Result;
            //var chk2 = _logInManager.Login("jimycarbonare@gmail.com", "123qwe", "TSEDergi");

            //var name = User.Identity.Name;
            //bool bak0 = User.IsInRole("admin");

            //var accessToken = CreateAccessToken(CreateJwtClaims(loginResult.Identity));
            //var loginResult = await GetLoginResultAsync("jimycarbonare@gmail.com", "123qwe", "TSEDergi");

            //await _signInManager.SignInAsync(loginResult.Identity, model.RememberClient);//_logInManager.LoginAsync("jimycarbonare@gmail.com", "123qwe", "TSEDergi").Result;

            //var name = User.Identity.Name;
            //bool bak0 = User.IsInRole("admin");





            var accessToken = CreateAccessToken(CreateJwtClaims(loginResult.Identity));
            return new AuthenticateResultModel
            {
                AccessToken = accessToken,
                EncryptedAccessToken = GetEncrpyedAccessToken(accessToken),
                ExpireInSeconds = (int)_configuration.Expiration.TotalSeconds,
                UserId = loginResult.User.Id
            };
        }

        [HttpGet]
        public List<ExternalLoginProviderInfoModel> GetExternalAuthenticationProviders()
        {
            return ObjectMapper.Map<List<ExternalLoginProviderInfoModel>>(_externalAuthConfiguration.Providers);
        }

        [HttpPost]
        public async Task<ExternalAuthenticateResultModel> ExternalAuthenticate([FromBody] ExternalAuthenticateModel model)
        {
            var externalUser = await GetExternalUserInfo(model);

            var loginResult = await _logInManager.LoginAsync(new UserLoginInfo(model.AuthProvider, model.ProviderKey, model.AuthProvider), GetTenancyNameOrNull());

            switch (loginResult.Result)
            {
                case AbpLoginResultType.Success:
                    {
                        var accessToken = CreateAccessToken(CreateJwtClaims(loginResult.Identity));
                        return new ExternalAuthenticateResultModel
                        {
                            AccessToken = accessToken,
                            EncryptedAccessToken = GetEncrpyedAccessToken(accessToken),
                            ExpireInSeconds = (int)_configuration.Expiration.TotalSeconds
                        };
                    }
                case AbpLoginResultType.UnknownExternalLogin:
                    {
                        var newUser = await RegisterExternalUserAsync(externalUser);
                        if (!newUser.IsActive)
                        {
                            return new ExternalAuthenticateResultModel
                            {
                                WaitingForActivation = true
                            };
                        }

                        // Try to login again with newly registered user!
                        loginResult = await _logInManager.LoginAsync(new UserLoginInfo(model.AuthProvider, model.ProviderKey, model.AuthProvider), GetTenancyNameOrNull());
                        if (loginResult.Result != AbpLoginResultType.Success)
                        {
                            throw _abpLoginResultTypeHelper.CreateExceptionForFailedLoginAttempt(
                                loginResult.Result,
                                model.ProviderKey,
                                GetTenancyNameOrNull()
                            );
                        }

                        return new ExternalAuthenticateResultModel
                        {
                            AccessToken = CreateAccessToken(CreateJwtClaims(loginResult.Identity)),
                            ExpireInSeconds = (int)_configuration.Expiration.TotalSeconds
                        };
                    }
                default:
                    {
                        throw _abpLoginResultTypeHelper.CreateExceptionForFailedLoginAttempt(
                            loginResult.Result,
                            model.ProviderKey,
                            GetTenancyNameOrNull()
                        );
                    }
            }
        }

        private async Task<User> RegisterExternalUserAsync(ExternalAuthUserInfo externalUser)
        {
            var user = await _userRegistrationManager.RegisterAsync(
                externalUser.Name,
                externalUser.Surname,
                externalUser.EmailAddress,
                externalUser.EmailAddress,
                Authorization.Users.User.CreateRandomPassword(),
                true
            );

            user.Logins = new List<UserLogin>
            {
                new UserLogin
                {
                    LoginProvider = externalUser.Provider,
                    ProviderKey = externalUser.ProviderKey,
                    TenantId = user.TenantId
                }
            };

            await CurrentUnitOfWork.SaveChangesAsync();

            return user;
        }

        private async Task<ExternalAuthUserInfo> GetExternalUserInfo(ExternalAuthenticateModel model)
        {
            var userInfo = await _externalAuthManager.GetUserInfo(model.AuthProvider, model.ProviderAccessCode);
            if (userInfo.ProviderKey != model.ProviderKey)
            {
                throw new UserFriendlyException(L("CouldNotValidateExternalUser"));
            }

            return userInfo;
        }

        private string GetTenancyNameOrNull()
        {
            if (!AbpSession.TenantId.HasValue)
            {
                return null;
            }

            return _tenantCache.GetOrNull(AbpSession.TenantId.Value)?.TenancyName;
        }


        [HttpPost]
        public AbpLoginResult<Tenant, User> GetLoginResult2Async(string usernameOrEmailAddress, string password, string tenancyName)
        {
            var loginResult = _logInManager.LoginAsync(usernameOrEmailAddress, password, tenancyName).Result;

            switch (loginResult.Result)
            {
                case AbpLoginResultType.Success:
                    return loginResult;
                default:
                    throw _abpLoginResultTypeHelper.CreateExceptionForFailedLoginAttempt(loginResult.Result, usernameOrEmailAddress, tenancyName);
            }
        }

        private async Task<AbpLoginResult<Tenant, User>> GetLoginResultAsync(string usernameOrEmailAddress, string password, string tenancyName)
        {
            var loginResult = await _logInManager.LoginAsync(usernameOrEmailAddress, password, tenancyName);

            switch (loginResult.Result)
            {
                case AbpLoginResultType.Success:
                    return loginResult;
                default:
                    throw _abpLoginResultTypeHelper.CreateExceptionForFailedLoginAttempt(loginResult.Result, usernameOrEmailAddress, tenancyName);
            }
        }

        private string CreateAccessToken(IEnumerable<Claim> claims, TimeSpan? expiration = null)
        {
            var now = DateTime.UtcNow;

            var jwtSecurityToken = new JwtSecurityToken(
                issuer: _configuration.Issuer,
                audience: _configuration.Audience,
                claims: claims,
                notBefore: now,
                expires: now.Add(expiration ?? _configuration.Expiration),
                signingCredentials: _configuration.SigningCredentials
            );

            return new JwtSecurityTokenHandler().WriteToken(jwtSecurityToken);
        }

        private static List<Claim> CreateJwtClaims(ClaimsIdentity identity)
        {
            var claims = identity.Claims.ToList();
            var nameIdClaim = claims.First(c => c.Type == ClaimTypes.NameIdentifier);

            // Specifically add the jti (random nonce), iat (issued timestamp), and sub (subject/user) claims.
            claims.AddRange(new[]
            {
                new Claim(JwtRegisteredClaimNames.Sub, nameIdClaim.Value),
                new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
                new Claim(JwtRegisteredClaimNames.Iat, DateTimeOffset.Now.ToUnixTimeSeconds().ToString(), ClaimValueTypes.Integer64)
            });

            return claims;
        }

        private string GetEncrpyedAccessToken(string accessToken)
        {
            return SimpleStringCipher.Instance.Encrypt(accessToken, AppConsts.DefaultPassPhrase);
        }
    }
}

我得到了一个合理的loginResult。PasswordSignInAsync方法成功返回。在这一点上,我得出结论,在过程中的标志是可以的。但是当我检查User.Identity之后。我看它是空的。对于我想做的SignInAsync method.All也是有效的--只使用远程服务登录用户。谢谢大家..。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-07 12:39:42

我解决了这个问题如下:

  1. 更改AccountController of Web.Mvc应用程序中的httpost登录方法如下 HttpPost公共虚拟异步任务登录(LoginViewModel loginModel,string returnUrl = "",string returnUrlHash = "") { var claims = GetClaims(loginModel.UsernameOrEmailAddress,loginModel.Password);if (Claims== null)//girişyapılamadı{返回Json(新的AjaxResponse { TargetUrl = "“});}loginModel{ var标识=新的loginModel.UsernameOrEmailAddress ClaimTypes.Name,ClaimTypes.Role);foreach (var索赔中的索赔){identity.AddClaim(新索赔(claim.type,claim.value));} //AbpSession.UserId=18;/使用标识/var主体=新的ClaimsPrincipal(身份);//等待ClaimsPrincipal主体,新AuthenticationProperties { IsPersistent = true };//bool = User.Identity.IsAuthenticated;/ bool bak = User.Identity.IsAuthenticated;//bool bak2 =User.IsInRole(“管理”);//返回RedirectToAction(“索引”,"Home");等待_signInManager.SignInAsync(身份,loginModel.RememberMe);等待UnitOfWorkManager.Current.SaveChangesAsync();bool bak = User.Identity.IsAuthenticated;var bakl = AbpSession.UserId;} returnUrl = NormalizeReturnUrl(returnUrl);如果(!string.IsNullOrWhiteSpace(returnUrlHash)) { returnUrl = returnUrl + returnUrlHash;}返回Json(新的AjaxResponse { TargetUrl = returnUrl });}
  2. 在AccountController of Web.Mvc应用程序中创建Web.Mvc方法 受保护列表GetClaims(string UserName,string Password) { List (var client =新HttpClient()) { string reqString = "http://localhost:21021/api/“+TokenAuth/GetClaims/GetClaims?用户名=”+ UserName +“&password=+密码+ "&TenantName=Default";//string reqString =”http://localhost:81/api/TokenAuth/GetClaims/GetClaims?UserName=admin&password=123qwe&TenantName=TSEDergi"“;HttpResponseMessage response = client.GetAsync(reqString).Result;//阻塞调用!如果(response.IsSuccessStatusCode) { // Get响应var JsonString = response.Content.ReadAsStringAsync();//反序列化数据(如果还没有包含Newtonsoft JSON包)//列表反序列化= JsonConvert.DeserializeObject(JsonString.Result);如果(反序列化的!= null) {反序列化的返回;}null{}返回null;}
  3. 创建所需的对象 公共类ClaimRootObject {公共字符串发行者{ get;set;}公共字符串originalIssuer { get;set;}公共属性属性{ get;set;}公共主题{ get;set;}公共字符串类型{ get;set;}公共字符串值{ get;set;}公共字符串valueType { get;set;}公共类属性{ public string authenticationType { get;set;} public bool isAuthenticated { get;set;}公共对象参与者{ get;公共对象bootstrapContext { get;set;}公共对象标签{ get;set;}公共对象标签{ get;set;}公共字符串名称{ get;set;}公共字符串nameClaimType { get;set;}公共字符串roleClaimType { get;set;}
  4. 最后一步,修改Web.Mvc项目的启动类以启用cookie身份验证。
代码语言:javascript
运行
复制
    public IServiceProvider ConfigureServices(IServiceCollection services)
        {
            // MVC
            services.AddMvc(
                options => options.Filters.Add(new AutoValidateAntiforgeryTokenAttribute())
            );

            #region cookieAuthentication
            services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie();
            #endregion cookieAuthentication

            IdentityRegistrar.Register(services);
            AuthConfigurer.Configure(services, _appConfiguration);

            services.AddScoped();

            services.AddSignalR();

            // Configure Abp and Dependency Injection
            return services.AddAbp(
                // Configure Log4Net logging
                options => options.IocManager.IocContainer.AddFacility(
                    f => f.UseAbpLog4Net().WithConfig("log4net.config")
                )
            );
        }

就这样。然后,您可以只使用远程服务登录用户到应用程序。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55338515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档