2015-09-09 5 views
4

Я использую провайдера OpenIdConnect с Owin/Katana для аутентификации в моем приложении asp.net mvc. OpenIdConnect Обеспечивает проверку подлинности пользователей Active Directory. Я хотел сделать простую проверку авторизации после аутентификации пользователя и перенаправления пользователя на другое представление.Перенаправить пользователя после аутентификации с помощью OpenIdConnect в ASP.Net MVC

app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions() 
     { 
      Authority = "url", 
      Scope="scopes", 
      ResponseType = "response", 
      ClientId = "clientid", 
      SignInAsAuthenticationType = "Cookies", 
      Notifications = new OpenIdConnectAuthenticationNotifications() 
      { 
       SecurityTokenValidated = (context) => 
       { 
        var identity = context.AuthenticationTicket.Identity; 
        var emailClaim = identity.Claims.Where(r => r.Type == ClaimTypes.Email).FirstOrDefault(); 

        var user = dbContext.Users.Where(u=>u.Email==emailClaim.Value); 
        if (user != null) 
        { 
         //add user information to claims. 
         identity.AddClaim(new Claim(CustomClaimTypes.PersonId, user.Name.ToString())); 
        } 
        else 
        { 
         //redirect to a page 
        } 

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

Как перенаправить пользователя, если его нет в моей базе данных.

+0

Я, наконец, смог достичь этого, используя специальный атрибут Authorize. – user3731783

+0

Не могли бы вы ответить на свой вопрос, немного более подробно, и отметить его как ответ? – pashute

+0

Уверенный и только что отправил мой ответ @pashute. Спасибо – user3731783

ответ

0

Я смог достичь этого, написав специальный AuthorizeAttribute и используя его для каждого класса в своем приложении. В пользовательском атрибуте authorite я проверяю претензию, которая будет доступна, если проверка авторизации будет успешной и перенаправит пользователя на отдельное представление, если оно не разрешено.

public class CustomAuthorize : AuthorizeAttribute 
{ 
    public override void OnAuthorization(System.Web.Mvc.AuthorizationContext filterContext) 
    { 
     base.OnAuthorization(filterContext); 

     if (filterContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      if(UserClaims.PersonId == 0) 
      { 
       UrlHelper helper = new UrlHelper(filterContext.RequestContext); 

       string url = helper.Action("Unauthorized","Error",null,filterContext.HttpContext.Request.Url.Scheme); 

       filterContext.Result = new RedirectResult(url); 
      } 
     } 
    } 
} 
12

Чтобы добавить к принятому ответу в случае, если кто-то сражается с этим, как я. Я обнаружил, что следующие варианты работали для меня -

Вариант 1

//redirect to a page 
context.AuthenticationTicket.Properties.RedirectUri = "Url"; 

Вариант 2

//redirect to a page  
context.HandleResponse(); 
context.Response.Redirect("/Error?message=" + context.Exception.Message); 

Имейте в виду, что второй вариант вызвал мой HttpContext.User.Identity быть пустым. Я полагаю, что HandlResponse прекращает всю обработку. Все еще полезно, если это не проблема.

+0

Вариант 1 приятный и чистый – Whoever

+0

Вариант 1 - это то, что я искал, поскольку я хотел, чтобы пользователь был подписан, а также перенаправлен. –

Смежные вопросы