web-dev-qa-db-ja.com

AspNetCore2.0クレームは常に空です

DotNet 4.5 MVC/WebAPIアプリケーションをAspNetCore2.0に変換しようとしていますが、Cookie認証を再び機能させるのに問題があります。 Cookieを設定して安全な方法にアクセスしようとすると、そこにアクセスできません。匿名メソッドにアクセスしてユーザーオブジェクトを検査すると、空です。認証タイプやクレームなどはありません。

私はできる限りこの記事に従いました: https://docs.Microsoft.com/en-us/aspnet/core/security/authentication/cookie?tabs=aspnetcore2x 。 Identityを使用していません。

Startup.csConfigureServicesの私のコードは次のとおりです。

  services.AddAuthentication("ACE_AUTH")                    
                    .AddCookie("ACE_AUTH",  options =>
                    {
                        options.AccessDeniedPath = "/Home/Index/";
                        options.LoginPath = "/Home/Index/";
                    });

Configureメソッドの私のコード:

app.UseAuthentication();

これが呼び出されると、プリンシパルは完全に入力されます。クッキーを設定する場所:

 await HttpContext.SignInAsync("ACE_AUTH", samlData.Principal);

私が試したことは何も、ユーザーを認証しようとしたときに私の主張が表示される原因にはなりませんでした。

7
Danny Ellis Jr.

これが私のために働いていることです:私が学んだことのほとんどは このMicrosoftドキュメント から来ていますが、あなたが言ったように、ドキュメントはあなたをそこまでずっと連れて行っていないようです。

startup.csで

public void ConfigureServices(IServiceCollection services)
    {
        ...

        services.AddAuthentication("ACE_AUTH")
        .AddCookie("ACE_AUTH", options => {
            options.AccessDeniedPath = "/api/Auth/Forbidden";
            options.LoginPath = "/";
            options.Cookie.Expiration = new TimeSpan(7,0,0,0);
        });
    }


public void Configure(IApplicationBuilder app, 
                      IHostingEnvironment env, 
                      ILoggerFactory loggerFactory)
    {
        ...

        app.UseAuthentication();
    }

そして、認証を処理するコントローラーで:

    [HttpPost()]
    [Route("api/[Controller]/[Action]/")]
    public async Task<JsonResult> Login([FromBody]Dictionary<string, string> loginData)
    {
        try
        {
            var loggedIn = true;
            if (loggedIn)
            {
                var claims = new List<Claim> {
                    new Claim(ClaimTypes.Name, "John Doe")
                };

                var identity = new ClaimsIdentity(CookieAuthenticationDefaults.AuthenticationScheme);
                identity.AddClaims(claims);
                ClaimsPrincipal principal = new ClaimsPrincipal(identity);

                await HttpContext.SignInAsync(
                    "ACE_AUTH",
                    principal,
                    new AuthenticationProperties
                    {
                        IsPersistent = true,
                        ExpiresUtc = DateTime.UtcNow.AddDays(7)
                    });
            }
            return new JsonResult(logRtn);
        }
        catch (Exception ex)
        {
            return new JsonResult(ex.Message);
        }
    }

認証リクエストの結果を認証してloggedInを割り当てることができる場合は、Cookieにクレームを保存できるはずです。次に、以下を使用して、承認/値の呼び出しを行っている可能性のあるコントローラーでその要求を呼び出すことができます。

    [HttpGet("[Action]", Name = "GetSomething")]
    [Route("[Action]")]
    public JsonResult something()
    {
        try
        {
            var loggedInUser = HttpContext.User;
            var claym = loggedInUser.Claims.FirstOrDefault(x => x.Type == ClaimTypes.Name);
            if (claym != null)
            {
                return new JsonResult(claym.Value);
                // returns "John Doe"
            }
            else
            {
                return new JsonResult("");
            }
        }
        catch (Exception ex)
        {
            return new JsonResult(ex.Message);
        }
    }
2
sec0ndHand