Exemplo n.º 1
0
        public async Task <IActionResult> OnGetAsync()
        {
            if (_env.IsProduction())
            {
                return(NotFound());
            }

            var me = await GraphClient.Me.Request()
                     .Select(u => new
            {
                u.EmployeeId,
                u.Surname,
                u.GivenName,
                u.Mail
            })
                     .GetAsync();

            #region Get UserData
            var userData = new GraphUserJsonData()
            {
                EmployeeId  = me.EmployeeId,
                LastName    = me.Surname,
                FirstName   = me.GivenName,
                MailAddress = me.Mail
            };

            // 画面表示用に格納
            UserData = userData;
            #endregion

            return(Page());
        }
Exemplo n.º 2
0
        private int InsertUser(GraphUserJsonData userData, string systemRoleValue, string slackId)
        {
            var ret = -1;

            try
            {
                //call helper & insert data
                UsersHelper dbHelper = new UsersHelper(_appSettings.Secrets.DbConnectionString);
                ret = dbHelper.InsertData(userData.EmployeeId, userData.LastName, userData.FirstName, systemRoleValue, slackId);

                _logger.LogDebug("Result count: {0}", ret);
            }
            catch (Exception ex)
            {
                _logger.LogError("Error GetSystemRoles: {0}", ex.Message);
            }

            return(ret);
        }
Exemplo n.º 3
0
        public async Task <IActionResult> OnPost()
        {
            // TODO: 入力チェック
            // TODO: 完了したことがわかる挙動

            var insertUserData = new GraphUserJsonData
            {
                EmployeeId = Request.Form["UserData.EmployeeId"],
                LastName   = Request.Form["UserData.LastName"],
                FirstName  = Request.Form["UserData.FirstName"],

                // TODO: 将来的にユーザー登録はアプリのDBに入れる+ADに登録、としたい。ADに登録するときにメールアドレスを使う
                MailAddress = Request.Form["UserData.MailAddress"]
            };

            var insertSystemRoleValue = Request.Form["SystemRoleValue"];

            var slackId = await GetSlackId(insertUserData.MailAddress);

            InsertUser(insertUserData, insertSystemRoleValue, slackId);

            return(Page());
        }
Exemplo n.º 4
0
        public async Task OnPageHandlerExecutionAsync(PageHandlerExecutingContext context, PageHandlerExecutionDelegate next)
        {
            if (!context.ActionDescriptor.AreaName.Equals(".auth"))
            {
                #region ADから情報とる
                var model = new UserDataModel(host: context.HttpContext.Request.Host)
                {
                    TenantId = _appSettings.TenantId,
                    ClientId = _appSettings.ClientId,
                };

                // セッションに保存した認証コードおよびアクセストークンを取得する
                var authenticationCode = context.HttpContext.Session.GetString(Constants.Session.AuthenticationCode);
                var accessToken        = context.HttpContext.Session.GetString(Constants.Session.AccessToken);

                if (string.IsNullOrEmpty(authenticationCode))
                {
                    // codeがなければリクエストする
                    _logger.LogDebug(@"Not have authentication code, redirect to request uri.");

                    #region Request Authorization Code
                    // 許可を求めるスコープ
                    var scopes = string.Join(" ", new List <string>()
                    {
                        Constants.Scope.UserRead,
                    });
                    _logger.LogDebug(@"Authentication request scopes: ""{0}""", scopes);

                    // 認証後にリダイレクトされたURLに含まれる'state'クエリの値と比べることで、CSRF対策が行える
                    var token = Convert.ToBase64String(Guid.NewGuid().ToByteArray());
                    context.HttpContext.Session.SetString(Constants.Session.AuthUriToken, token);
                    _logger.LogDebug(@"Session saved: Auth-code request token ""{0}""", token);


                    var redirectUri = model.GetRequestAuthenticationCodeUri(scopes, token);


                    _logger.LogDebug(@"Redirect target uri: ""{0}""", redirectUri.AbsoluteUri);

                    // リダイレクト前に、リクエストパスをセッションに格納
                    context.HttpContext.Session.SetString(Constants.Session.RequestPath, context.HttpContext.Request.Path.Value);

                    context.Result = new RedirectResult(redirectUri.AbsoluteUri);
                    return;

                    #endregion
                }
                else if (string.IsNullOrEmpty(accessToken))
                {
                    // codeがある場合はユーザー情報を取得する
                    _logger.LogDebug(@"Having authentication code, get access token.");

                    #region Get AccessToken
                    accessToken = await model.GetAccessTokenAsync(authenticationCode, _appSettings.Secrets.ClientSecret);

                    _logger.LogDebug(@"GetAccessTokenAsync status code: ""{0} {1}""", (int)model.Response.StatusCode, model.Response.StatusCode);
                    _logger.LogDebug(@"Access token: ""{0}""", accessToken);

                    context.HttpContext.Session.SetString(Constants.Session.AccessToken, accessToken ?? "!!!! NO ACCESSTOKEN !!!!");
                    _logger.LogDebug(@"Session saved: Access token ""{0}""", accessToken);
                    #endregion
                }

                _logger.LogDebug(@"Get user data(from MS Graph API).");


                #region Get UserData
                var graphClient = new GraphServiceClient(new DelegateAuthenticationProvider((message) =>
                {
                    message.Headers.Authorization = new AuthenticationHeaderValue(JwtBearerDefaults.AuthenticationScheme, accessToken);

                    return(Task.CompletedTask);
                }));

                var me = await graphClient.Me.Request()
                         .Select(u => new
                {
                    u.EmployeeId,
                    u.Surname,
                    u.GivenName,
                    u.Mail
                })
                         .GetAsync();

                var userData = new GraphUserJsonData()
                {
                    EmployeeId  = me.EmployeeId,
                    LastName    = me.Surname,
                    FirstName   = me.GivenName,
                    MailAddress = me.Mail
                };
                #endregion
                #endregion

                #region テーブルから情報取る
                UsersHelper dbHelper       = new UsersHelper(_appSettings.Secrets.DbConnectionString);
                UsersData   usersTableData = dbHelper.SelectData(userData.EmployeeId);
                #endregion

                #region セッションに情報入れる
                context.HttpContext.Session.SetString(Constants.Session.EmployeeId, usersTableData.EmployeeId);
                context.HttpContext.Session.SetString(Constants.Session.SystemRoleId, usersTableData.SystemRoleId);
                #endregion
            }

            await next.Invoke();
        }