2014-02-10 47 views
1

我正在使用C#VS2012爲一個小項目。我工作的項目是一個需要用戶通過開放ID(臉書,谷歌等)登錄的網站。C#開放ID身份驗證

在向網站添加身份驗證之後,我必須先登錄才能測試並嘗試解決問題。這是一個煩惱,對開發環境沒有意義。
有沒有一種方法可以在dev中不進行身份驗證或跳過它,並只在將代碼部署到生產環境時才添加它?

回答

1

是的,有。但是,沒有一個解決方案。根據您認證用戶的方式,解決方案可能會有所不同。一個想法是使用Preprocessor Directives。這樣,您可以根據是否構建調試版本或發行版本來有條件地編譯身份驗證代碼。

例如,在窗體身份驗證的MVC應用程序,你可以使用此:

//Define that we are debugging 
#define DEBUG  

public ActionResult DoSomething() 
{ 
    //Determine if this is a debug build 
    //If it is, then we want to exclude the authentication verification 
    //portion of the code 

    //Include the code if DEBUG has not been defined 
    #if !DEBUG 
    if(!HttpContext.User.Identity.IsAuthenticated) 
    { 
     //Not authenticated 
     return new HttpUnauthorizedResult(); 
    } 
    #endif 
    //Authenticated 
    DoOtherStuff(); 
} 

正如你所看到的,DEBUG指令尚未確定時HttpUnathorizedException只拋出。 DoOtherStuff()始終執行,即使用戶可能未登錄。

這種方法的問題是,通常當您需要用戶登錄時,您需要他/她的帳戶詳細信息來執行某些操作。

,例如:

public ActionResult Post(PostModel post) 
{ 
    #if !DEBUG 
    if(!HttpContext.User.Identity.IsAuthenticated) 
    { 
     return new HttpUnauthorizedResult(); 
    } 
    #endif 

    User user = GetLoggedInUser(); //Returns null because the user 
            //is not authenticated 

    Post createdPost = new Post 
    { 
     Title = post.Title, 
     Content = post.Content, 

     //Uh oh, the user is not logged in. This post will not have an author! 
     Author = user, 
     PostDate = DateTime.Now 
    }; 

    DbContext.Posts.Add(createdPost); 
    DbContext.SaveChanges(); 

    return View(); 
} 

一種不同的解決方案將允許用戶登錄,而不會在實際登錄

例如:

public ActionResult LogIn(string username) 
{ 
    #if !DEBUG 
     //Require the user to actually login through OpenId 
    #else 
     //Don't require the user/dev to actually login, instead just give them access 
     FormsAuthentication.SetAuthCookie(username, false); 
    #endif 
} 

然後,當用戶的/ dev試圖訪問...

public ActionResult Post(PostModel post) 
{ 
    // The user will be logged in because you just gave them the 
    // authentication cookie 
    if(!HttpContext.User.Identity.IsAuthenticated) 
    { 
     return new HttpUnauthorizedResponse(); 
    } 
    else 
    { 
     User user = GetLoggedInUser(); //Returns user 
     Post createdPost = new Post 
     { 
      //ect.. 
      User = user 
     }; 

     // Save post 

     return View(); 
    } 
} 

總體回答你的問題:

有沒有辦法不具有認證或跳過它在開發中,並添加它,只有當它的代碼部署到生產?

是的,但是確切的解決方案取決於您的情況。

+0

我沒有預料到預處理指令,但我會接受!我希望能夠在類聲明之前添加像[PronOnly]一樣的設置。謝謝! – Adrian