проблема управления NullReferenceException - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть проблема в блоке Try Catch моего кода ниже.В функции SetUser я использую функцию getId, которая возвращает Id, если пользователь существует в БД, в противном случае я получаю исключение NullReferenceException.
Я вызываю эту функцию в блоке try catch в Login.У меня проблема с перехватом, потому что когда генерируется исключение, я бы хотел, чтобы пользователь был перенаправлен на страницу регистрации.Но когда я пытаюсь выполнить свой код с несуществующим пользователем, я думаю, что у меня есть своего рода бесконечный цикл, потому что моя страница не перестает загружаться.Я не понимаю, что я делаю не так.Нужна помощь, пожалуйста

функция Логин:

 public static void Login(HttpRequest Request, HttpResponse Response, string redirectUri)
{
    if (Request.IsAuthenticated)
        return;
    if (!Request.Form.AllKeys.Contains("id_token"))
        return;
    string value = Request.Form.Get("id_token");
    JObject id_token = JwtDecode(value);
    string upn = id_token.GetValue("upn").ToString();
    DateTime expiretime = GetExpireTime(id_token);

    try
    {
        SetUser(id_token);
    }
    catch (Exception ex)
    {
        Response.Redirect("~/register.aspx");
    }
    FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, upn, DateTime.UtcNow, expiretime, false, id_token.ToString(), FormsAuthentication.FormsCookiePath);
    string encryptedcookie = FormsAuthentication.Encrypt(ticket);
    HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedcookie);
    cookie.Expires = expiretime;
    Response.Cookies.Add(cookie);
    redirectUri = GetRedirectUrl(Request, redirectUri);
    Response.Redirect(redirectUri, true);
}

функция setUser:

 private static void SetUser(JObject id_token)
{
    string email = id_token.GetValue("unique_name").ToString();
    string name = id_token.GetValue("given_name").ToString();
    DataSet ds;

    List<Claim> claims = new List<Claim>()
    {
        new Claim(ClaimTypes.Email, email),
        new Claim(ClaimTypes.Name, GetId(email))
    };

    string roles= "SELECT name FROM AspNetRoles;
    ds = GetDataSet(roles);

    if (ds.Tables.Count > 0)
    {
        foreach (var row in ds.Tables(0).Rows)
            claims.Add(new Claim(ClaimTypes.Role, row("name")));
    }

    ClaimsIdentity claimsIdentity = new ClaimsIdentity(claims, "Cookies");
    ClaimsPrincipal principal = new ClaimsPrincipal(claimsIdentity);
    HttpContext.Current.GetOwinContext().Authentication.User = principal;
    Thread.CurrentPrincipal = principal;
}

функция getId:

 public static string getId(string email)
{
    return ((new UserManager()).FindByEmail(email)).Id;
}
...