使用开放式ID连接服务器

时间:2017-04-26 08:15:19

标签: c# asp.net authentication asp.net-core aspnet-contrib

我即将在我的asp.net核心应用程序中实现基于承载的身份验证。来自.NET Framework,核心内容对我来说还是一个新手。从服务器获取令牌确实很有效。但是,如何在以下请求中确定用户是否经过身份验证?在.NET Framework项目中,我曾经使用

(ClaimsIdentity)Thread.CurrentPrincipal.Identity.IsAuthenticated;

但是,这会返回带有空或默认声明的标识。这是我到目前为止的设置:

我已经开始使用OpenIdConnect.Server框架和Get Started部分中的示例代码了。这很好用,我的客户收到了一个Bearer Token。我通过以下方式在我的Startup.cs中构建它:

public class Startup
{
    [...]

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddApplicationInsightsTelemetry(Configuration);
        services.AddMvc();
        services.AddAuthentication();
        [...]
    }

    public void Configure([...])
    {
        app.UseDefaultFiles();
        app.UseStaticFiles();
        app.UseMvc();
        app.UseOpenIdConnectServer(options =>
        {
            [code of example]
        }
    }

在客户端,我使用检索到的令牌进行进一步的请求

The Bearer Token is transmitted in the header.

现在,我现在如何访问当前登录的用户声明,或者我如何知道他/她是否经过身份验证?

我试过了

// within api controller:
var isAuth = this.User.Identity.IsAuthenticated

// using DI
public class MyClass(IHttpContextAccessor httpContextAccessor) {
    public void MyMethod() {
        var isAuth = httpContextAccessor.HttpContext.User.Identity.IsAuthenticated;
    }
}

但是这总是返回false,声明是一些默认值。 我错过了什么吗?我是否需要安装一些额外的服务或中间件?

1 个答案:

答案 0 :(得分:1)

OpenID Connect服务器中间件需要注意的一点是,它不会为您验证传入的访问令牌(它只发布它们)。由于您使用的是默认令牌格式(已加密),因此您可以使用AspNet.Security.OAuth.Validation包:

public class Startup
{
    [...]

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddApplicationInsightsTelemetry(Configuration);
        services.AddMvc();
        services.AddAuthentication();
        [...]
    }

    public void Configure([...])
    {
        app.UseDefaultFiles();
        app.UseStaticFiles();
        app.UseOpenIdConnectServer(options =>
        {
            [code of example]
        });
        app.UseOAuthValidation();
        app.UseMvc();
    }
}