Перенаправить пользователя после аутентификации с помощью OpenIdConnect в ASP.Net MVC

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

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);
                }
             }
        });

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


person user3731783    schedule 09.09.2015    source источник
comment
Наконец-то я смог добиться этого с помощью настраиваемого атрибута Authorize.   -  person user3731783    schedule 09.10.2015
comment
Не могли бы вы ответить на свой вопрос, немного подробнее, и отметить его как ответ?   -  person pashute    schedule 02.11.2015
comment
Конечно, и я только что отправил свой ответ @pashute. Спасибо   -  person user3731783    schedule 02.11.2015


Ответы (2)


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

Опция 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 прекращает всю обработку. Все еще полезно, если это не проблема.

person majita    schedule 18.01.2016
comment
Вариант 1 красивый и чистый - person Whoever; 20.09.2016
comment
Вариант 1 - это то, что я искал, поскольку я хотел, чтобы пользователь вошел в систему, а также был перенаправлен. - person Lee Gunn; 04.12.2017

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

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);
            }
        }
    }
}
person user3731783    schedule 02.11.2015