0

アイデンティティ・サーバーでユーザーを認証し、クレームを戻すことができます(クレームとしての役割とともに)。私は役割を考慮しないと、すべてがうまいです。彼が特定の役割を持っていて特別に作成された "Unauthorized"または "Access denied"ページにリダイレクトしない限り、ユーザーを制限したいと思います。以下のコードは、権限のない例外を発生させません。OWIN Katanaミドルウェア:返されたクレームに特定の役割がない場合にユーザーをブロックする方法

var canAccessPortal = id.HasClaim(c => c.Type == "role" && c.Value == "XP"); 
if (!canAccessPortal) 
{ 
    throw new UnauthorizedAccessException(); 
} 

完全app.UseOpenIdConnectAuthenticationコードは以下の通りです:web.configファイル内

app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions 
{ 
    ClientId = ClientId, 
    Authority = IdServBaseUri, 
    RedirectUri = ClientUri, 
    PostLogoutRedirectUri = ClientUri, 
    ResponseType = "code id_token token", 
    Scope = "openid profile roles clef", 
    TokenValidationParameters = new TokenValidationParameters 
    { 
     NameClaimType = "name", 
     RoleClaimType = "role" 
    }, 
    SignInAsAuthenticationType = "Cookies", 

    Notifications = new OpenIdConnectAuthenticationNotifications 
    { 
     AuthorizationCodeReceived = async n => 
     { 
      // use the code to get the access and refresh token 
      var tokenClient = new TokenClient(
       TokenEndpoint, 
       ClientId, 
       ClientSecret); 

      var tokenResponse = await tokenClient.RequestAuthorizationCodeAsync(n.Code, n.RedirectUri); 

      if (tokenResponse.IsError) 
      { 
       throw new Exception(tokenResponse.Error); 
      } 

      // use the access token to retrieve claims from userinfo 
      var userInfoClient = new UserInfoClient(UserInfoEndpoint); 

      var userInfoResponse = await userInfoClient.GetAsync(tokenResponse.AccessToken); 

      // create new identity 
      var id = new ClaimsIdentity(n.AuthenticationTicket.Identity.AuthenticationType); 
      id.AddClaims(userInfoResponse.Claims); 
      id.AddClaim(new Claim("access_token", tokenResponse.AccessToken)); 
      id.AddClaim(new Claim("expires_at", DateTime.Now.AddSeconds(tokenResponse.ExpiresIn).ToLocalTime().ToString())); 
      id.AddClaim(new Claim("id_token", n.ProtocolMessage.IdToken)); 
      id.AddClaim(new Claim("sid", n.AuthenticationTicket.Identity.FindFirst("sid").Value)); 

      var canAccessPortal = id.HasClaim(c => c.Type == "role" && c.Value == "XP"); 
      if (!canAccessPortal) 
      { 
       throw new UnauthorizedAccessException(); 
      } 

      n.AuthenticationTicket = new AuthenticationTicket(
       new ClaimsIdentity(id.Claims, n.AuthenticationTicket.Identity.AuthenticationType, "name", "role"), 
       n.AuthenticationTicket.Properties); 
     }, 

     RedirectToIdentityProvider = n => 
     { 
      // if signing out, add the id_token_hint 
      if (n.ProtocolMessage.RequestType == OpenIdConnectRequestType.LogoutRequest) 
      { 
       var idTokenHint = n.OwinContext.Authentication.User.FindFirst("id_token"); 

       if (idTokenHint != null) 
       { 
        n.ProtocolMessage.IdTokenHint = idTokenHint.Value; 
       } 
      } 

      return Task.FromResult(0); 
     } 
    } 
}); 

カスタムエラーノード:

<customErrors mode="On" defaultRedirect="~/account/error"> 
    <error statusCode="401" redirect="~/account/unauthorized" /> 
</customErrors> 

答えて

0

MVCパイプラインの承認を実装するのに最適な場所はですAuthorizationAttributeを実装しています。ここでは、要求コンテキストを完全に制御できます。 MVCを承認する場合は、System.Web.MVC .AuthorizeAttributeを実装し、Override AuthorizeCoreを実装する必要があります。

protected override bool AuthorizeCore(HttpContextBase httpContext) { 

     if (!base.AuthorizeCore(httpContext)) { 
      return false; 
     } 
     //Check roles from DB service 
     return roleservice.UserInRole && UserClaims.Count > 0; 
    } 

    /// <summary> 
    /// Processes HTTP requests that fail authorization. 
    /// </summary> 
    /// <param name="filterContext">Encapsulates the information for using <see cref="T:System.Web.Mvc.AuthorizeAttribute" />. The <paramref name="filterContext" /> object contains the controller, HTTP context, request context, action result, and route data.</param> 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) { 
     filterContext.Result = new RedirectResult("~/main/unauthorized"); 
    } 
関連する問題