मैं एक सर्वर साइड ब्लेज़र ऐप बनाने की कोशिश कर रहा हूं जो उपयोगकर्ताओं को आइडेंटिटी सर्वर 4 के खिलाफ साइन इन करने देता है और स्थानीय प्राधिकरण को संभालने के लिए कुकीज़ का उपयोग करता है। मेरे वर्तमान सेटअप के लिए कोड यहां दिया गया है:

services.AddAuthentication(options => {
                               options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                               options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                               options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
                           })
        .AddCookie("Cookies")
        .AddOpenIdConnect("oidc",
                          options => {
                              Configuration.GetSection("OidcSettings").Bind(options);

                              // remove unecessary claims
                              options.ClaimActions.MapAllExcept("amr", "sub");
                              options.TokenValidationParameters = new TokenValidationParameters {
                                                                                                    NameClaimType = ClaimTypes.NameIdentifier
                                                                                                };
                          });

मैं उपयोगकर्ता के नाम के रूप में नाम पहचानकर्ता दावे का उपयोग करना चाहता हूं और मैं इस धारणा के तहत था कि पिछली मैपिंग को इसका ख्याल रखना चाहिए। दुर्भाग्य से, यह काम नहीं कर रहा है। यहाँ कुछ डेमो कोड है:

@page "/"
@using Microsoft.AspNetCore.Components
@using Microsoft.AspNetCore.Http
@inject IHttpContextAccessor ContextAccessor
@inject NavigationManager NavigationManager
@inject AuthenticationStateProvider AuthenticationStateProvider
<h1>Hello, world!</h1>

Welcome to your new app.

<AuthorizeView>
  <NotAuthorized>
    <form method="post" action="/Account/Login">
      <button>Iniciar</button>
    </form>
  </NotAuthorized>
  <Authorized>
    <h1>Hi, @ContextAccessor.HttpContext.User.Identity.Name!</h1>
    <h1>Hi, @(GetUsernameAsync().Result)!</h1>
  </Authorized>
</AuthorizeView>

@code{
    private async Task<string> GetUsernameAsync() {
      var user1 = ContextAccessor.HttpContext.User.Identity.Name;
      var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
      var user = authState.User;

      if (user.Identity.IsAuthenticated)
      {
            return user.Identity.Name;
      }

      return "Nop";
    }
}

दोनों ही मामलों में, उपयोगकर्ता का नाम हमेशा शून्य पर सेट होता है। डीबगर से मुझे जो मिल रहा है वह यहां दिया गया है:

User Identity from aspnet core context

कुछ चीजें हैं जो मुझे नहीं मिल रही हैं:

  1. मुझे यह प्रमाणीकरण प्रकार क्यों मिल रहा है? क्या यह कुकीज या एप्लिकेशन कुकी नहीं होनी चाहिए (या ऐसा कुछ)?
  2. नाम के दावे को नाम पहचानकर्ता में क्यों नहीं बदला गया?

मुझे निश्चित रूप से कुछ याद आ रहा है, लेकिन मुझे यकीन नहीं है कि क्या ...

धन्यवाद

0
Luis Abreu 18 नवम्बर 2019, 15:00

1 उत्तर

सबसे बढ़िया उत्तर

ठीक है, तो कई परीक्षणों के बाद, मैं अंततः इसे काम करने में कामयाब रहा हूं। मैंने उप-दावे को अपने उपयोगकर्ता के उपयोगकर्ता नाम के रूप में उपयोग करना शुरू कर दिया है। मुझे OpenId Connect सेटअप पर कुछ चीज़ें बदलनी पड़ी हैं:

.AddOpenIdConnect("oidc",
                  options => {
                      Configuration.GetSection("OidcSettings").Bind(options);

                      options.TokenValidationParameters = new TokenValidationParameters {
                                                                                            NameClaimType = "sub"
                                                                                        };
                  });
0
Luis Abreu 18 नवम्बर 2019, 18:02