IdentityServer4并与signinmanager

时间:2018-04-09 16:09:09

标签: authentication asp.net-core authorization identityserver4

我们正在开发一个使用IdentityServer4,Web api端点,Web管理前端和移动应用程序的应用程序。我们设置了这样的Web应用程序

public void ConfigureServices(IServiceCollection services) {
        services.AddMvc();

        JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();

        services
            .AddAuthentication(options => {
                options.DefaultScheme = "Cookies";
                options.DefaultChallengeScheme = "oidc";
            })
            .AddCookie("Cookies")
            .AddOpenIdConnect("oidc", options => {
                options.SignInScheme = "Cookies";

                options.Authority = "http://localhost:5000";
                options.RequireHttpsMetadata = false;

                options.ClientId = "mvc";
                options.ClientSecret = "secret";
                options.ResponseType = "code id_token";

                options.SaveTokens = true;
                options.GetClaimsFromUserInfoEndpoint = true;

                options.Scope.Add("api1");
                options.Scope.Add("offline_access");
            });
    }

这是有效的,当我们调用一个具有[Authorize]属性的控制器时,我们会被重定向,登录,返回到调用站点,一切都很顺利。

现在我们正在尝试添加授权。我已经看到了视频,其中显示的是不将授权信息放入令牌中,我从概念上得到了这一点。但现在我想在UI中做一些简单的事情,比如显示或隐藏基于用户是否登录的链接。默认的_LoginPartial页面具有以下内容:

@inject SignInManager<User> SignInManager
@inject UserManager<User> UserManager

@if (SignInManager.IsSignedIn(User)) {
  User is signed in
} else {
  User is anonymous
}

为了使用SignInManager和UserManager,我们必须设置依赖服务:

services.AddDbContext<Entities.ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

services.AddIdentity<User, IdentityRole<long>>()
  .AddEntityFrameworkStores<ApplicationDbContext>()
  .AddDefaultTokenProviders();

但是当我这样做时,它会破坏家庭控制器上的授权属性。

如何使用IdentityServer4测试用户是否登录并访问Web应用程序中的角色存储?我必须遗漏一些允许我们从外部进行身份验证然后转过身来确定用户可以使用/使用的角色/声明的内容。

1 个答案:

答案 0 :(得分:1)

请改用User.Identity.IsAuthenticatedUser.Identity.IsInRole等内容。虽然您可以使用ASP.NET Identity支持IdentityServer,但重要的是要意识到您的MVC应用程序使用IdentityServer,而不是 Identity进行身份验证和授权。因此,SignInManager.IsSignedIn之类的内容将无效。