我们可以将身份服务器4中的用户限制为特定的应用程序吗?

Mah*_*pta 6 authentication identity identityserver4

我正在尝试为企业方案实现IdentityServer 4。

我了解用户已向身份服务器注册。

我的问题是如何向用户授予对应用程序的权限,就像需要用户分配给特定的应用程序一样,如果未分配应用程序,则应返回未授权状态。

如果用户需要访问多个应用程序,则需要多个分配。

我在寻找一种方式,身份服务器无效提交令牌,如果用户没有访问应用程序在一个去,即使挑战令牌,如果它是由用户访问其他应用程序提交的可能是有效的

JSO*_*SON 5

Identity Server绝对在最基本的级别上处理授权。它创建在应用程序授权中必不可少的授权码和access_tokens。没有他们,您将无法获得授权。因此,其他人声称Identity Server不做授权是完全错误的。

一个星期前,我来到这里寻找解决这个问题的方法。我想通过不授予用户访问令牌的方式来限制用户使用特定的应用程序,如果他们不能满足某些参数(在我的情况下是UserClient表)。幸运的是我有解决方案。Identity Server 4实现了一些所谓的CustomValidator,它们发生在授权或令牌创建时。他们是

   internal class DefaultCustomAuthorizeRequestValidator : ICustomAuthorizeRequestValidator
   internal class DefaultCustomTokenRequestValidator : ICustomTokenRequestValidator
   public class DefaultCustomTokenValidator : ICustomTokenValidator
Run Code Online (Sandbox Code Playgroud)

当他们被叫时,那里的名字真的说了出来。每个包含一个方法

   public Task ValidateAsync(CustomAuthorizeRequestValidationContext context)
   { 
        return Task.CompletedTask;
   }
Run Code Online (Sandbox Code Playgroud)

有事吗 没错!它什么也没做。几乎就像是要替换它们一样。(它是)。

您可以在此区域添加自定义逻辑以拒绝请求。CustomAuthorizeRequestValidationContext包含ClientId和用户声明信息。它还包含一个称为IsError的布尔值。只需将其设置为true即可!拒绝访问。您还可以设置错误消息等。这是一个实现ICustomAuthorizeRequestValidator接口的示例,该接口将根据用户ID限制用户

  public Task ValidateAsync(CustomAuthorizeRequestValidationContext context)
    {
        var sub = context.Result.ValidatedRequest.Subject.FindFirst("sub");
        if (sub != null && sub.Value != "88421113")
        {
            context.Result.IsError = true;
            context.Result.Error = "Unauthorized";
            context.Result.ErrorDescription = "You are not authorized for this client";
        }

        return Task.CompletedTask;
    }
Run Code Online (Sandbox Code Playgroud)

随意注入一两个dbcontext来读取userclient表。我检查子声明是否为空,因为在实际登录之前,它将多次被点击。

从我注意到的角度来看,这三种方法在使用方面表现相似,但在结果方面却有所不同。设置错误ICustomAuthorizeRequestValidator将阻止重定向到您的客户端,而是将您定向到Identity Server错误屏幕。其他两个将重定向回客户端,并且通常会抛出一些HttpResponse错误。因此,替换ICustomAuthorizeRequestValidator似乎效果最好。

因此,只需创建一个实现ICustomAuthorizeRequestValidator的类。然后像这样将其添加到您的身份服务中

services.AddIdentityServer().AddCustomAuthorizeRequestValidator<MyCustomValidator>()
Run Code Online (Sandbox Code Playgroud)

这样就完成了。

  • 太多的话。希望能短一半。但无论如何,请接受我的 10 分:) (2认同)

Sco*_*ady 1

对于用户来说,IdentityServer只是认证。授权应由您的应用程序处理。

身份验证 = 验证用户是谁

授权=验证用户可以做什么

更新

我写了一篇关于这个主题的文章来阐明 OAuth 2.0 的作用不是用户级授权。希望能帮助到你!https://www.scottbrady91.com/OAuth/OAuth-is-Not-User-Authorization