0

Mit dem folgenden Login-Methode und „Startup.cs“, den Controller mit [autorisieren (Roles = " Administrator ")] Attribut funktioniert gut, aber diejenigen, die einen authentifizierten Benutzer benötigen und sich nicht um ihre Rollen kümmern, geben" Statuscode: 401 Unauthorized "zurück.Die Controller mit [autorisieren] Attribut nicht autorisierte Fehler zurück, aber die, die mit [autorisieren (Roles = „Administrator“)] arbeiten perfekt

Login-Methode:

public async void LogOn(IUser user, string domain, bool remember, TimeSpan timeout) 
    { 
     var context = AccessorsHelper.HttpContextAccessor.HttpContext; 

     await context.SignOutAsync(IdentityConstants.ApplicationScheme); 

     var claims = new List<Claim> 
     { 
      new Claim(ClaimsIdentity.DefaultNameClaimType, user.GetId().ToString()) 
     }; 

     claims.AddRange(user.GetRoles().Select(role => new Claim(ClaimsIdentity.DefaultRoleClaimType, role))); 

     await context.SignInAsync(IdentityConstants.ApplicationScheme, 
      new ClaimsPrincipal(new ClaimsIdentity(claims)), 
      new AuthenticationProperties 
      { 
       IsPersistent = remember, 
       ExpiresUtc = DateTimeOffset.UtcNow.Add(timeout) 
      }); 
    } 

Startup.cs:

public class Startup 
{ 
    // This method gets called by the runtime. Use this method to add services to the container. 
    // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940 
    public void ConfigureServices(IServiceCollection services) 
    { 
     services.InjectOliveDependencies(); 

     var builder = services.AddMvc(options => { 
      options.ModelBinderProviders.Insert(0, new Olive.Mvc.OliveBinderProvider()); 
      //options.ModelBinderProviders.Insert(0, new TestBinderProvider()); 
     }) 
     .ConfigureApplicationPartManager(manager => 
     { 
      var oldMetadataReferenceFeatureProvider = manager.FeatureProviders.First(f => f is MetadataReferenceFeatureProvider); 
      manager.FeatureProviders.Remove(oldMetadataReferenceFeatureProvider); 
      manager.FeatureProviders.Add(new ReferencesMetadataReferenceFeatureProvider()); 
     }); ; 
     //ConfigureMvc(builder); 

     services.Configure<RazorViewEngineOptions>(options => { 
      options.ViewLocationExpanders.Add(new ViewLocationExpander()); 
     }); 

     services.AddSingleton<IUserStore<User>, UserStore>(); 
     services.AddSingleton<IRoleStore<string>, RoleStore>(); 
     services.AddIdentity<User, string>(); 
     services.AddAuthentication(IdentityConstants.ApplicationScheme); 
    } 

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. 
    public void Configure(IApplicationBuilder app, IHostingEnvironment env) 
    { 
     app.ConfigureOliveDependencies(env); 

     if (env.IsDevelopment()) 
     { 
      app.UseDeveloperExceptionPage(); 
      app.UseBrowserLink(); 
     } 
     else 
     { 
      app.UseExceptionHandler("/Home/Error"); 
     } 

     app.UseAuthentication(); 

     app.UseStaticFiles(); 

     app.UseMvc(routes => 
     { 
      //routes.MapRoute(
      // name: "default", 
      // template: "{controller=Home}/{action=Index}/{id?}"); 
     }); 
    } 
} 

Außerdem bin ich mit ASP.Net Core 2.0.

+1

Benötigt 'LogOn' Methode wirklich' [Authorize] 'Attribut? Es sollte anonym erlauben, auf alle zuzugreifen, die versuchen, sich anzumelden ... –

+0

@BalagurunathanMarimuthu Meine 'LogOn' Methode hat kein' [Authotize] 'Attribut. Ich stelle nur die Methode zur Verfügung, weil ich denke, dass damit etwas nicht stimmt. –

Antwort

0

Mit einer kleinen Änderung in der LogIn Methode das Problem behoben ist.

public async void LogOn(IUser user, string domain, bool remember, TimeSpan timeout) 
    { 
     var context = AccessorsHelper.HttpContextAccessor.HttpContext; 

     await context.SignOutAsync(IdentityConstants.ApplicationScheme); 

     var claims = new List<Claim> 
     { 
      new Claim(ClaimsIdentity.DefaultNameClaimType, user.GetId().ToString()) 
     }; 

     claims.AddRange(user.GetRoles().Select(role => new Claim(ClaimsIdentity.DefaultRoleClaimType, role))); 

     await context.SignInAsync(IdentityConstants.ApplicationScheme, 
      new ClaimsPrincipal(new ClaimsIdentity(claims, "AuthenticationType")), // AuthenticationType is just a text and I do not know what is its usage. 
      new AuthenticationProperties 
      { 
       IsPersistent = remember, 
       ExpiresUtc = DateTimeOffset.UtcNow.Add(timeout) 
      }); 
    } 

Überprüfen Sie den kommentierten Teil für die Änderung.

Verwandte Themen