在 ASP.Net MVC 中使用 OpenIdConnect 进行身份验证后重定向用户
Redirect user after authentication with OpenIdConnect in ASP.Net MVC
我在 asp.net mvc 应用程序中使用带有 Owin/Katana 的 OpenIdConnect 提供程序进行身份验证。 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);
}
}
});
如果用户不在我的数据库中,我该如何重定向他。
我能够通过编写自定义 AuthorizeAttribute 并在我的应用程序中的每个 class 上使用它来实现这一点。在自定义授权属性中,我正在检查声明,如果授权检查成功,该声明将可用,如果未授权,则将用户重定向到单独的视图。
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);
}
}
}
}
添加到已接受的答案中,以防有人像我一样与此作斗争。我发现以下选项对我有用 -
选项 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 停止了所有处理。如果这不是问题,仍然有用。
我在 asp.net mvc 应用程序中使用带有 Owin/Katana 的 OpenIdConnect 提供程序进行身份验证。 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);
}
}
});
如果用户不在我的数据库中,我该如何重定向他。
我能够通过编写自定义 AuthorizeAttribute 并在我的应用程序中的每个 class 上使用它来实现这一点。在自定义授权属性中,我正在检查声明,如果授权检查成功,该声明将可用,如果未授权,则将用户重定向到单独的视图。
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);
}
}
}
}
添加到已接受的答案中,以防有人像我一样与此作斗争。我发现以下选项对我有用 -
选项 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 停止了所有处理。如果这不是问题,仍然有用。